【问题标题】:Java Code FormattingJava 代码格式化
【发布时间】:2011-02-22 00:04:08
【问题描述】:

我正在使用 FreeMarker 生成 java 代码,但由于大部分是动态生成的,因此很难控制代码的形成。

我想让代码格式正确。有谁知道用于 java 代码的 lib 或类似漂亮打印机的东西?

【问题讨论】:

标签: java formatting coding-style


【解决方案1】:

Google java 格式非常适合我。 https://github.com/google/google-java-format

maven构建后,在core/target文件夹中找到google-java-format-0.1-SNAPSHOT.jar,尝试java -jar google-java-format-0.1-SNAPSHOT.jar查看使用信息。

【讨论】:

    【解决方案2】:

    您可以使用Eclipse's 或Jalopy 代码格式化程序重新格式化生成的代码。

    【讨论】:

    • 但我想以编程方式进行。 eclipse的code formater可以作为独立的lib使用吗?
    • 理论上是的,但不会是小菜一碟。但我相信 jalopy 格式化程序可以更容易嵌入。
    • 是的,我的第一个实现是使用 Eclipse 的格式化程序完成的。但由于它的简单性,我最终与sourceforge.net/projects/jastyle 交换了它。
    【解决方案3】:

    你可以运行像astyle这样的格式化程序

    【讨论】:

    • 你知道java中的一个lib可以做同样的事情吗?我想要一个包含在我的项目中,并将生成的所有字符串传递给格式化程序。
    【解决方案4】:

    Jalopy 运行良好。您可以使用它的 CLI 进行独立使用。 Japlopy Console Plugin

    【讨论】:

      【解决方案5】:

      我想我会使用 Eclipse 的 CodeFormatter,就像这个人一样:http://ssscripting.wordpress.com/2009/06/10/how-to-use-the-eclipse-code-formatter-from-your-code/

      更新: 最终使用了 jastyle (http://sourceforge.net/projects/jastyle/)。 这是一个例子:

      public static String formatJavaCode(String code) throws Exception {
          ASFormatter formatter = new ASFormatter();
      
          // bug on lib's implementation. reported here: http://barenka.blogspot.com/2009/10/source-code-formatter-library-for-java.html
          code.replace("{", "{\n");
      
          Reader in = new BufferedReader(new StringReader(code));
          formatter.setJavaStyle();
          in.close();
          return FormatterHelper.format(in,formatter);
      }
      

      【讨论】:

        【解决方案6】:

        您可以在 Eclipse 中编辑 .java 文件时对其进行格式化。 当你不编辑它时,它是否被格式化并不重要。

        【讨论】:

          【解决方案7】:

          我从 FreeMarker 切换到我自己的 Java 源代码生成实用程序。可从此处访问源: https://source.mysema.com/svn/mysema/projects/codegen/trunk/

          它的设计方式是您只需调用 API 并且输出格式正确。这是一个例子:

              JavaWriter writer = new JavaWriter(new StringWriter());   
              writer.beginClass("FieldTests");
              writer.privateField("String", "privateField");
              writer.privateStaticFinal("String", "privateStaticFinal", "\"val\"");
              writer.protectedField("String","protectedField");
              writer.field("String","field");
              writer.publicField("String","publicField");
              writer.publicStaticFinal("String", "publicStaticFinal", "\"val\"");
              writer.publicFinal("String", "publicFinalField");
              writer.publicFinal("String", "publicFinalField2", "\"val\"");        
              writer.end();
          

          变成了

          public class FieldTests {
          
              private String privateField;
          
              private static final String privateStaticFinal = "val";
          
              protected String protectedField;
          
              String field;
          
              public String publicField;
          
              public static final String publicStaticFinal = "val";
          
              public final String publicFinalField;
          
              public final String publicFinalField2 = "val";
          
          }
          

          我为 Querydsl 开发了 codegen 实用程序,它将 Java 域类型镜像到查询类型。所以序列化需求非常复杂。使用简单的 FreeMarker 模板无法扩展。输出自定义太多,Java比模板语言语法更好控制。

          这不是 Codegen 模块的广告。我只是想指出,对于高度可定制的序列化,FreeMarker 可能无法扩展。

          【解决方案8】:

          最简单的方法是将您的代码粘贴到 eclipse java IDE 中,然后对您选择的代码执行 ctrl+f。它将以易于阅读的形式格式化您的代码。

          【讨论】:

            【解决方案9】:

            对于具有大量配置选项以适合您的代码格式样式的独立命令行工具,您可以尝试:

            它们都是免费的、开源的,并且可以格式化的不仅仅是 Java 源代码(C、C++、C# 等)

            【讨论】:

              【解决方案10】:

              您可以简单地在 eclipse 中激活保存操作并使用您自己的或预定义的格式化程序。

              只需在首选项中激活两者:

              • 窗口 -> 首选项 -> Java -> 代码样式 -> 格式化程序

              同时激活保存操作:

              • Window -> Preferences -> Java -> Editor -> Save Action -> Format source code (Format all lines & Imports)

              Code Formatter | Save Action

              【讨论】:

                猜你喜欢
                • 2011-12-14
                • 1970-01-01
                • 2011-04-20
                • 2012-11-23
                • 1970-01-01
                • 2016-08-20
                • 2010-11-29
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多