我有一些Java代码与SQL语句编写为Java字符串(请不要OR/M火焰战争,嵌入式SQL是什么-不是我的决定)。

为了便于维护,我在几行代码中从语义上将SQL语句分解为几个连接在一起的字符串。所以不是这样的:

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";

我有这样的东西:

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";

这种风格使SQL更容易阅读和维护(IMHO),特别是对于较大的查询。例如,我可以将编辑器设置为“覆盖”模式,并相当容易地就地修改文本。

注意,这个问题不仅仅局限于SQL的特定示例。任何使用任何垂直格式编写的代码,特别是表格结构,都很容易被漂亮的打印机破坏。

现在,一些项目成员使用Eclipse编辑器,当他们格式化整个源文件时,语义格式经常会被破坏。

是否有一种方法可以指示Eclipse在格式化方面忽略源代码中的某些行?

我正在寻找类似于切换Eclipse格式化器的特殊注释之类的东西。理想情况下,这样的注释可以配置为我们选择的任何格式,其他格式化器也可以编程来尊重它:

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

显然,一种“解决方案”是让我们的团队成员对一些外部格式化器(如Jalopy或JIndent)进行标准化,但这不是这个问题的重点(也不是我对这个项目的决定):我正在特别地寻找一种避免Eclipse格式化器的方法。

理想情况下,一个解决方案将允许我为Eclipse格式化器插入指令,而不需要使用Eclipse的团队成员进行任何IDE重新配置(除了可能选择与格式化器无关的命令注释:STOP-ECLIPSE-FORMATTING→STOP-FORMATTING)。


当前回答

Eclipse 3.6允许您通过放置一个特殊的注释来关闭格式化,例如

// @formatter:off
...
// @formatter:on

必须在Eclipse首选项中打开/关闭功能:Java > Code Style > Formatter。点击编辑,关闭/打开标签,启用启用关闭/打开标签。

也可以在首选项中更改神奇的字符串——请在这里查看Eclipse 3.6文档。

更多的信息

Java > 代码风格 > 格式化程序 > 编辑 > /在标签

这个首选项允许你定义一个标签来禁用和一个标签来启用格式化器(参见格式化器配置文件中的Off/On Tags选项卡):

您还需要启用Java Formatting中的标志

其他回答

我使用了固定宽度的字符串部分(用空格填充),以避免格式化程序弄乱SQL字符串缩进。这将给您带来复杂的结果,并且在SQL中不忽略空白的情况下将不起作用,但可能是有帮助的。

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";

另一种方法:在Eclipse 3.6中,在“换行”下的“常规设置”中有一个选项“永不连接已经换行的行”。这意味着格式化程序将对长行进行换行,但不会撤销您已有的任何换行。

这个方法有效:

String x = "s" + //Formatter Hack
    "a" + //
    "c" + //
    "d";

我建议不要使用格式化程序。糟糕的代码应该看起来糟糕,而不是人为的好。好的代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。

您可以将其配置为不连接已经换行的行,而不是关闭格式化。与Jitter的回复类似,下面是Eclipse STS的回复:

属性→Java代码样式→格式化程序→启用项目特定设置或配置工作区设置→编辑→换行(选项卡)→勾选“永远不要加入已经换行的行”

保存,适用。

幽灵注释,添加//你想要新的行,是伟大的!

The @formatter: off adds a reference from the code to the editor. The code should, in my opinion, never have such references. The phantom comments (//) will work regardless of the formatting tool used. Regardless of Eclipse or InteliJ or whatever editor you use. This even works with the very nice Google Java Format The phantom comments (//) will work all over your application. If you also have Javascript and perhaps use something like JSBeautifier. You can have similar code style also in the Javascript. Actually, you probably DO want formatting right? You want to remove mixed tab/space and trailing spaces. You want to indent the lines according to the code standard. What you DONT want is a long line. That, and only that, is what the phantom comment gives you!