我有一些 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
显然,一个“解决方案”是让我们的团队成员对一些外部格式化程序(如 Jalopy 或 JIndent)进行标准化,但这不是这个问题的意义所在(也不是我对这个项目的决定):我正在专门寻找寻找一种临时避免使用 Eclipse 格式化程序的方法。
理想情况下,一个解决方案将允许我插入 Eclipse 格式化程序的指令不需要团队成员使用 Eclipse 进行任何 IDE 重新配置(除了可能选择与格式化程序无关的命令注释:STOP-ECLIPSE-FORMATTING
→ STOP-FORMATTING
)。
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 3.5 M4 的 AFAIK 有一个选项“从不加入行”,它保留用户换行符。也许这就是你想要的。
否则有这个丑陋的黑客
String query = //
"SELECT FOO, BAR, BAZ" + //
" FROM ABC" + //
" WHERE BAR > 4";
您可以使用另一种解决方案来抑制特定块注释的格式。在块注释的开头使用 /*-
(注意连字符),如果您格式化文件的其余部分,格式将不会受到影响。
/*-
* Here is a block comment with some very special
* formatting that I want indent(1) to ignore.
*
* one
* two
* three
*/
您可以将其配置为不加入已经换行的行,而不是关闭格式。与 Jitter 的响应类似,这里是 Eclipse STS:
属性→Java代码样式→格式化程序→启用项目特定设置或配置工作区设置→编辑→换行(选项卡)→选中“从不加入已经换行的行”
保存,申请。
https://i.stack.imgur.com/2QvvK.png
您必须打开添加格式化程序标签的功能。在菜单栏中转到:
Windows → 首选项 Java → 代码样式 → 格式化程序
按编辑按钮。选择最后一个选项卡。注意开/关框并使用复选框启用它们。
如果将加号放在行首,则格式不同:
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 中,在“换行”下的“常规设置”下,有一个“从不加入已经换行的行”的选项。这意味着格式化程序将换行很长的行,但不会撤消您已经拥有的任何换行。
@xpmatteo 有禁用部分代码的答案,但除此之外,默认的 Eclipse 设置应设置为仅格式化编辑的代码行而不是整个文件。
Preferences->Java->Editor->Save Actions->Format Source Code->Format Edited Lines
这首先会阻止它发生,因为您的同事正在重新格式化他们实际上并没有改变的代码。这是一个很好的做法,可以防止导致源代码管理上的差异变得无用的事故(当整个文件由于较小的格式设置差异而重新格式化时)。
如果打开/关闭标签选项被关闭,它也会阻止重新格式化。
幻影注释,在您想要换行的地方添加 //
,非常棒!
@formatter: off 将代码中的引用添加到编辑器。在我看来,代码应该永远不会有这样的引用。无论使用何种格式化工具,幻影注释 (//) 都将起作用。无论 Eclipse 或 InteliJ 还是您使用的任何编辑器。这甚至适用于非常好的 Google Java 格式。幻影注释 (//) 将适用于您的整个应用程序。如果你也有 Javascript 并且可能使用 JSBeautifier 之类的东西。您也可以在 Javascript 中使用类似的代码样式。实际上,您可能确实想要格式化吗?您想删除混合制表符/空格和尾随空格。您想根据代码标准缩进行。你不想要的是一条长线。那个,只有那个,是幻影评论给你的!
不是很漂亮,但可以使用默认设置和第一行:
String query = "" +
"SELECT FOO, BAR, BAZ" +
" FROM ABC " +
" WHERE BAR > 4 ";
这个技巧有效:
String x = "s" + //Formatter Hack
"a" + //
"c" + //
"d";
我建议不要使用格式化程序。糟糕的代码应该看起来很糟糕而不是人为的好。好的代码需要时间。你不能在质量上作弊。格式化是源代码质量的一部分。
maven-formatter-plugin
时也有效(我在格式化程序 xml 文件中手动更改了设置org.eclipse.jdt.core.formatter.use_on_off_tags
)。