ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一些 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 更易于阅读和维护(恕我直言),尤其是对于较大的查询。例如,我可以将我的编辑器置于“覆盖”模式并相当容易地就地修改文本。

请注意,此问题泛化到 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 )。

我们遇到过这个问题。 Eclipse 应该有一个选项,即总是在 + 所在的 String 构造函数中换行,而不管字符串的下一位是否适合该行。但事实并非如此。 :-(
显然这个特性是在 Eclipse 3.6M6 中添加的:bugs.eclipse.org/bugs/show_bug.cgi?id=27079
注意:如果你只是想防止eclipse弄乱你的评论,那么你可以在每一行前面使用//。要注释掉一个块,突出显示并按 Ctrl+/。
请注意,现在 10 年后,Java 14 可能会带来多行字符串,这将成为过去。
文本块从 Java 15 开始就可用,并且适用于这样的 SQL 查询。请参阅openjdk.java.net/jeps/378

S
Shridutt Kothari

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

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

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

也可以更改首选项中的魔术字符串 - check out the Eclipse 3.6 docs here

更多信息

Java > 代码样式 > 格式化程序 > 编辑 > 关闭/打开标签

此首选项允许您定义一个标签来禁用和一个标签来启用格式化程序(请参阅格式化程序配置文件中的关闭/打开标签选项卡):

https://i.stack.imgur.com/GwcgT.png

您还需要启用 Java 格式化中的标志


本页其他地方提到的“从不加入行”选项也非常有用。
必须“打开”开/关功能。在 Eclipse 首选项中:Java > 代码样式 > 格式化程序。单击“编辑”按钮,“关闭/打开标签”,选中“启用关闭/打开标签”。
这在 JavaScript 代码样式首选项 中不可用,我有 the exact opposite problem 格式。 :(
团队应该将 Eclipse 首选项(文件)的副本导出到他们的 wiki,并要求每个人都使用相同的。对我们很有效。 ;)
非常感谢!这在使用 maven-formatter-plugin 时也有效(我在格式化程序 xml 文件中手动更改了设置 org.eclipse.jdt.core.formatter.use_on_off_tags)。
j
jitter

格式化程序上来自 Eclipse 3.5 M4 的 AFAIK 有一个选项“从不加入行”,它保留用户换行符。也许这就是你想要的。

否则有这个丑陋的黑客

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

所以除了设置“从不加入线”选项之外,我还必须写这些“幻影”评论? “从不加入行”部分不应该单独工作吗?
是的,当然应该。幻影注释是一种替代方法(以防它不存在,或者您被早期版本卡住等)。
我已经将这种方法与 TOAD 中的自定义格式模板结合使用,以允许我从 JAVA 代码中剥离旧 SQL,重新格式化它并获取所有无关的注释,然后将其放回 JAVA。这很痛苦,但它允许我们现在在保存 Java 代码时自动格式化。感谢您的建议!
如果不检查“从不加入行”,开/关宏对我不起作用 - 谢谢!
C
Community

请参阅this answer on SO

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

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

来源:Documentation at Oracle


这是最好的答案,因为它不依赖于用户 IDE 的配置。谢谢。
i
ilinca

您可以将其配置为不加入已经换行的行,而不是关闭格式。与 Jitter 的响应类似,这里是 Eclipse STS:

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

保存,申请。

https://i.stack.imgur.com/2QvvK.png


我认为这对 SQL 示例之类的事情会有所帮助,但我不确定这对于完全禁用 IDE 格式化程序的一般情况是否足够。
这个解决方案在使用构建器模式时非常出色,并且随着 Java 8 中 lambda 的引入,它的相关性肯定会增加。
这也适用于格式化 java 流函数,如 map->filter->reduce。
s
stites

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

Windows → 首选项 Java → 代码样式 → 格式化程序

按编辑按钮。选择最后一个选项卡。注意开/关框并使用复选框启用它们。


A
Ahmed Ashour

如果将加号放在行首,则格式不同:

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

这可能是一个有趣的妥协。一般来说,我想避免由于一种工具的一些不良行为而过多地更改代码的格式。在这种情况下,字符串连接运算符更像是一个意外,而不是 SQL 的本质。这就是为什么我更喜欢将它们写在每一行的末尾。我觉得应该强调SQL作为行首。但这可能是在没有让我保留所需格式的解决方案的情况下的好方法。谢谢!
别客气。实际上,几十年来我一直将 + 号放在行的最前面,而不是为了愚弄格式化程序。我更喜欢它们在前面,因为它让我更清楚正在发生的事情:行尾的内容有时会丢失。当我们使用燃木编译器时,它是某个地方的项目标准,它一直困扰着我。
E
Evvo

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


G
Guus

我正在使用固定宽度的字符串部分(用空格填充)以避免格式化程序弄乱我的 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                          ";

k
kmccoy

替代方法:在 Eclipse 3.6 中,在“换行”下的“常规设置”下,有一个“从不加入已经换行的行”的选项。这意味着格式化程序将换行很长的行,但不会撤消您已经拥有的任何换行。


R
Robin

@xpmatteo 有禁用部分代码的答案,但除此之外,默认的 Eclipse 设置应设置为仅格式化编辑的代码行而不是整个文件。

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

这首先会阻止它发生,因为您的同事正在重新格式化他们实际上并没有改变的代码。这是一个很好的做法,可以防止导致源代码管理上的差异变得无用的事故(当整个文件由于较小的格式设置差异而重新格式化时)。

如果打开/关闭标签选项被关闭,它也会阻止重新格式化。


Y
Yoon5oo

幻影注释,在您想要换行的地方添加 //,非常棒!

@formatter: off 将代码中的引用添加到编辑器。在我看来,代码应该永远不会有这样的引用。无论使用何种格式化工具,幻影注释 (//) 都将起作用。无论 Eclipse 或 InteliJ 还是您使用的任何编辑器。这甚至适用于非常好的 Google Java 格式。幻影注释 (//) 将适用于您的整个应用程序。如果你也有 Javascript 并且可能使用 JSBeautifier 之类的东西。您也可以在 Javascript 中使用类似的代码样式。实际上,您可能确实想要格式化吗?您想删除混合制表符/空格和尾随空格。您想根据代码标准缩进行。你不想要的是一条长线。那个,只有那个,是幻影评论给你的!


D
Damien

不是很漂亮,但可以使用默认设置和第一行:

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

T
Thomas Jung

这个技巧有效:

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

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


不使用格式化程序只是一个坏主意。格式化程序有助于捕获错误并使代码保持一致状态。
一个有趣的建议,但我不明白格式化如何告诉我们代码是否好。
我认为他的意思是他觉得写得不好、格式不好的代码应该保持原样,而不是格式化它以希望“改进它”。写得不好、格式不好的代码应该以某种方式“突出”,以便可以轻松识别。不太确定我是否完全同意,但我认为这就是想法。
@Francis - 错误:自动格式化代码如何发现错误?一致性:一致性是一个很好的论据,但整体代码质量更重要。您可以为汉堡翻转定义一个很好的一致过程,但它永远不会适用于高级美食。如果您忽略了足够多的事实,烹饪 a 可能是一项相当复杂的活动或微不足道的事情。如果您认为软件开发就像汉堡包翻转工具,那么您可以使用它们来执行一致性。这不是反对格式化指南的论据,但如果开发人员不关心这些指南,则不会关心其他要点。
我的论点是:我写的代码很好,而且我坚持格式指南。但我很懒惰。当我可以编写五行草率的代码,按下格式按钮并感到高兴时,为什么我必须插入正确数量的空格和换行符?在我格式化代码后,使用我的工具确保结果始终是完美的,我和任何人一样对格式化是纳粹分子。如果格式化只是一箭之遥,那么没有理由反对坚持指导方针(除了它们可能特别糟糕)。所有项目成员共享相同的代码格式设置。