我有一些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)。


这个方法有效:

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

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


格式器上的Eclipse 3.5 M4中的AFAIK有一个选项“Never Join Lines”,它保留了用户换行符。也许这就是你想要的。

还有一个丑陋的黑客

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

如果你把加号放在行首,它的格式就不同了:

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

我使用了固定宽度的字符串部分(用空格填充),以避免格式化程序弄乱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允许您通过放置一个特殊的注释来关闭格式化,例如

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

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

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

更多的信息

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

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

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


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


您必须打开添加格式化程序标记的功能。在菜单栏转到:

窗户 → 首选项 Java → 代码风格 → 格式化程序

按下编辑按钮。选择最后一个选项卡。注意On/Off框,并用复选框启用它们。


@xpmatteo可以禁用部分代码,但除此之外,默认的eclipse设置应该设置为只格式化编辑过的代码行,而不是整个文件。

Preferences->Java->Editor->Save Actions->Format Source Code->Format Edited Lines

这将在第一时间阻止它发生,因为您的同事正在重新格式化他们实际上没有更改的代码。这是一个很好的实践,可以防止使源代码控制中的diff变得无用(当整个文件因为微小的格式设置差异而重新格式化时)。

如果关闭了on/off标签选项,它还可以防止重新格式化。


在SO上看到这个答案。

您可以使用另一种解决方案来抑制特定块注释的格式化。在块注释的开头使用/*-(注意连字符),如果格式化文件的其余部分,则格式不会受到影响。

/*-
 * Here is a block comment with some very special
 * formatting that I want indent(1) to ignore.
 *
 *    one
 *        two
 *            three
 */

来源:Oracle文档。


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

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

保存,适用。


每一行以双斜杠“//”结束。这将防止eclipse将它们全部移动到同一行上。


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

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!


不是很漂亮,但适用于默认设置和第一行:

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