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


当前回答

您可以将其配置为不连接已经换行的行,而不是关闭格式化。与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!

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

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                          ";

这个方法有效:

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

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

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

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

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

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