如何关闭Eclipse代码格式化程序以针对Java代码的某些部分?

527

我有一些Java代码,其中包含作为Java字符串编写的SQL语句(请不要进行ORM争论,嵌入式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更易于阅读和维护,尤其是对于较大的查询。例如,我可以将编辑器设置为“覆盖”模式,并相当轻松地就地修改文本。

请注意,这个问题不仅限于特定的SQL示例。任何用任何垂直格式编写的代码,特别是表格式结构,都容易被美化器破坏。

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

是否有一种方法可以指示Eclipse忽略某些源行以实现格式化?

我正在寻找像一个特殊注释那样可以切换Eclipse格式化程序的东西。理想情况下,这样的注释可以配置为我们选择的任何内容,并且其他格式化程序也可以编程以尊重它:

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

显然,一种“解决”方法是让我们的团队成员采用一些外部格式化工具(如JalopyJIndent)进行标准化,但这不是本问题的重点(在这个项目中也不是我的决定):我特别寻找一种避免以临时方式使用Eclipse格式化程序的方法。

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


1
我们遇到了这个问题。Eclipse 应该有一个选项,可以在字符串构造函数中始终在+处断行,而不管下一部分字符串是否适合在该行上。但它没有。 :-( - JeeBee
显然,这个功能是在Eclipse 3.6M6中添加的:https://bugs.eclipse.org/bugs/show_bug.cgi?id=27079 - Guillaume
注意:如果您只是想防止Eclipse破坏您的注释,那么可以在每行前面使用//。要注释掉一个块,请将其突出显示并按Ctrl + /。 - John Henckel
请注意,现在已经过去了10年,Java 14可能会引入多行字符串,使得这种情况成为过去。 - Thorbjørn Ravn Andersen
1
文本块自Java 15起可用,适用于像这样的SQL查询。请参见http://openjdk.java.net/jeps/378 - user18619318
14个回答

2

幽灵注释很棒,可以在你想要新行的地方添加 //

  1. @formatter: off 会在代码和编辑器之间添加一个引用。我个人认为,代码不应该有这样的引用。

  2. 无论使用哪种格式工具,幽灵注释(//)都可以正常工作。无论是 Eclipse、IntelliJ 还是其他任何编辑器,甚至可以与非常好用的 Google Java Format 一起使用。

  3. 幽灵注释(//)可以在应用程序中的任何位置工作。如果您还使用 Javascript,可能会使用类似于 JSBeautifier 的工具。您可以在 Javascript 中使用类似的代码风格。

  4. 实际上,您可能确实希望进行格式化,对吧?您希望删除混合制表符/空格和尾随空格。您希望根据代码标准缩进行。 您不想要的是一行很长的代码。 这就是幽灵注释给您的全部内容!


1
在 VS Code 中,
请在您的格式化程序 XML 设置中设置以下属性。
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>

然后在您的代码中使用以下标签来开启和关闭格式

            // @formatter:off
            //Create Payment Transaction
            payTxn = EN_PaymntTxn.builder()
                    .orderId(paymReq.getOrderId())
                    .paymentMode(paymReq.getPaymentMode())
                    .amount(paymReq.getAmount())
                    .paymentStatus("PAID")
                    .referenceNumber(UUID.randomUUID().toString())
                    .timestamp(Instant.now())
                    .build();
            // @formatter:on

0

虽然不太美观,但默认设置下可以工作,并且对于第一行也有效:

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

-4

这个黑科技可行:

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

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

10
不使用格式化器只是一个坏主意;格式化器有助于捕获错误并使代码保持一致的状态。 - Francis Upton IV
3
我认为他的意思是,他觉得应该保留写得很差、格式不好的代码,而不是试图通过格式化来“改进”它。写得很差、格式不好的代码应该以某种方式“突出”,以便能够轻松地识别它。我不完全同意,但我想这就是他的想法。 - Greg Mattes
1
@Francis - Bugs:自动格式化的代码如何找到错误?一致性:一致性是一个不错的论点,但总体代码质量更重要。你可以为煎汉堡定义一个漂亮的一致性流程,但它永远不会适用于高级烹饪。烹饪可以是一个相当复杂的活动,或者如果你忽略足够的事实,也可以是微不足道的。如果你认为软件开发就像煎汉堡,那么强制执行一致性的工具就适合你。这并不是反对格式指南的论点,但如果开发人员不关心这些指南,他们也不会关心其他基本要素。 - Thomas Jung
4
我的观点是:我写的代码很好,符合格式指南。但我很懒。为什么我要在能够写出五行不规范代码的情况下,还要花时间来插入正确数量的空格和换行符呢?我可以写完代码后,使用我的工具进行格式化,确保结果总是完美的,之后我对格式方面就像纳粹一样严格了。如果格式化只需要按下一个键,那么遵循格式指南是毫无争议的(除非它们真的特别糟糕)。所有项目成员都共享相同的代码格式设置。 - Per Wiklander
这完全误解了“糟糕的代码不应该看起来好”的论点:相反,一个干净且一致格式化的源代码将帮助您更快地发现“代码异味”,因为您的内部解析器可以启动并看到“但那个东西看起来太复杂了!”或者简单地说,“那看起来很奇怪?” - stolsvik
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接