Java 中通用括号之间没有 space 的原因

Reasoning behind no space between Generic brackets in Java

查看 Checkstyle 文档中的 GenericWhitespaceCheck

Left angle bracket (<):

  • should be preceded with whitespace only in generic methods definitions.
  • should not be preceded with whitespace when it is precede method name or following type name.
  • should not be followed with whitespace in all cases.

Right angle bracket (>):

  • should not be preceded with whitespace in all cases.
  • should be followed with whitespace in almost all cases, except diamond operators and when preceding method name.

我不确定我是否完全理解为什么 < 后面不应该跟 space 以及为什么 > 前面不应该跟一个。

换句话说,为什么 Map<String> 约定优于 Map < String >

这仅仅是因为随着参数数量和深度的增加,没有spaces的版本更具可读性。

比如,Map<String, List<String>>Map < String, List < String > > ?

更具可读性

还有一个一般性问题,是否有一些 repository/guides 解释了 Checkstyle 约定背后的原因?

大多数编码风格都有每行或每列长度的字符数限制。减少空格使行更短更易于阅读。

例如,google code style for java 的列限制为 100 个字符。

编码风格取决于语言背后的社区,所以我建议检查他们的标准。

an early tutorial on generics 的介绍(自 2004 年起)说(强调我的):

This tutorial is aimed at introducing you to generics. You may be familiar with similar constructs from other languages, most notably C++ templates. If so, you’ll soon see that there are both similarities and important differences. If you are not familiar with look-a-alike constructs from elsewhere, all the better; you can start afresh, without unlearning any misconceptions.

这是承认 Java 泛型看起来像 C++ 模板。 C++ 模板通常还会在开始 < 之后和结束 > 之前省略 space。

关于 Java 泛型的约定将遵循它们在早期教程中的编写方式。

虽然我没有任何证据或研究来支持我的理论,但我的理由如下:

凝聚力

一个(某种语言-哲学的)基本原理可以是:

类型的参数化(泛型的主要作用)如在Map<String, Object>中属于type-name,同括号一样,参数属于method-name .因此,将参数添加到签名应遵循一致的间距规则:参数化括号周围没有 space(无论是在泛型类型的参数定义中,还是在方法的参数定义中)。

因此,天使括号连贯地定义了 "type signature" 并且应该尽可能接近类型(语义和空间),这意味着没有 space 应该解开这种关系。

可读性

从(清洁代码)的角度来看,避免 spaces 有明显的好处:

天使括号周围的空格会使它们被误读或误解释为逻辑比较运算符。