【问题标题】:Reasoning behind no space between Generic brackets in JavaJava中通用括号之间没有空格的推理
【发布时间】:2019-12-27 17:17:59
【问题描述】:

查看 Checkstyle 文档中的 GenericWhitespaceCheck

左尖括号(<):

  • 只能在泛型方法定义中以空格开头。
  • 在方法名称或类型名称之前不应以空格开头。
  • 不应在所有情况下都跟有空格。

右尖括号(>):

  • 不应在所有情况下都以空格开头。
  • 在几乎所有情况下都应后跟空格,菱形运算符和方法名称前面除外。

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

换句话说,为什么Map<String>Map < String > 的约定?

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

例如,Map<String, List<String>>Map < String, List < String > > 更具可读性?

作为一个普遍问题,是否有一些存储库/指南解释了 Checkstyle 约定背后的原因?

【问题讨论】:

  • 同括号。 (a, b, c(d))<a, b, c<d>>。而且你不只是把所有东西都挤在一起。您可以在逗号后放置空格,而不是 <a,b,c<d>>
  • 推理基本上是,“因为它就是这样”。这是更大的社区接受的惯例;这是零空白和过多空白之间的平衡。另外,它应该是Map<String, List<String>>(注意逗号后面的空格)。
  • 这也类似于写简单的古英语:标点符号后的空格,如逗号、句号、问号和感叹号。打开大括号之前和关闭大括号之后的空格。人们习惯了这种风格,而且当所有东西都挤在一起时,它更容易阅读。
  • Java大部分时间不关心空格。您可以将一个超过 10,000 行的类全部放在一行上,并删除所有非严格需要的空格,例如,从变量名中描述变量类型,它仍然可以编译。我们添加空格(包括换行符)的原因是为了使代码可读。可读性是最重要的。
  • 我的评论是为了暗示没有像您给出的 C 示例那样基于行为的原因。在这种情况下,是否存在空格不会改变代码的编译或行为方式。

标签: java whitespace checkstyle readability code-readability


【解决方案1】:

虽然我没有证据或研究可以作为我的理论依据,但我的理由如下:

凝聚力

一种(一种语言哲学的)基本原理可能是:

类型的参数化(泛型的主要作用)例如Map<String, Object> 属于类型名称,就像括号和参数属于方法名称一样。因此向签名添加参数应该遵循一致的间距规则:参数化括号周围没有空格(在泛型类型的参数定义中,也不是在方法的参数定义中)。

因此,天使括号连贯地定义了“类型签名”,并应尽可能接近类型(语义和空间),这意味着任何空间都不应解开这种关系。

可读性

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

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

【讨论】:

    【解决方案2】:

    an early tutorial on generics 的介绍(从 2004 年开始)说(强调我的):

    本教程旨在向您介绍泛型。你可能熟悉 来自其他语言的类似结构,尤其是 C++ 模板。如果是这样,你很快就会 看到有相似之处和重要差异。如果你不熟悉 使用其他地方的 look-a-alike 构造,那就更好了;你可以重新开始,没有 消除任何误解。

    这是承认 Java 泛型看起来像 C++ 模板。 C++ 模板通常也会在开头 < 之后和结尾 > 之前省略空格。

    围绕 Java 泛型的约定将沿用它们在早期教程中的编写方式。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这不是原因。如果是这样,则在其他地方会省略空格,例如在逗号之后,或者在 for 循环声明中的分号之后。
      猜你喜欢
      • 2017-09-24
      • 1970-01-01
      • 2012-12-17
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多