【问题标题】:Generic type parameter naming convention for Java (with multiple chars)?Java的通用类型参数命名约定(带有多个字符)?
【发布时间】:2011-02-23 11:01:41
【问题描述】:

在我编写的某些接口中,我想用多个字符命名泛型类型参数,以使代码更具可读性。

类似......

Map<Key,Value>

而不是这个...

Map<K,V>

但是当涉及到方法时,类型参数看起来像 java-classes,这也令人困惑。

public void put(Key key, Value value)

这似乎 Key 和 Value 是类。我发现或想到了一些符号,但没有像 Sun 的约定或一般最佳实践。

我猜到或找到的替代方案...

Map<KEY,VALUE>
Map<TKey,TValue>

【问题讨论】:

  • 为什么要创建一个新约定?
  • @AmirAfghani 来自问题:使代码更具可读性。
  • 从技术上讲,IDE 中泛型的不同色调应该作为一个足够好的指标

标签: java generics naming-conventions


【解决方案1】:

Oracle 在Java Tutorials > Generics > Generic Types 中推荐以下内容:

类型参数命名约定

按照惯例,类型参数名称是单个大写字母。这与您已经知道的变量naming 约定形成鲜明对比,并且有充分的理由:如果没有这种约定,就很难区分类型变量和普通类或接口名称。

最常用的类型参数名称有:

  • E - 元素(Java 集合框架广泛使用)
  • K - 键
  • N - 编号
  • T - 类型
  • V - 值
  • S、U、V 等 - 第 2、第 3、第 4 类

您将在整个 Java SE API 和本课的其余部分中看到这些名称。

我会坚持这样做,以避免在开发人员和可能的维护人员之间造成混淆。

【讨论】:

  • 新的流框架也使用R作为结果,A作为累加器。
  • Blech,单字母命名。我遵循这个约定是因为约定比描述性名称更重要,但很遗憾这是他们能想到的最好的。
  • @warbaker:我发现这是区分参数化类型和实际类的好方法。否则,您将如何判断,例如List&lt;Element&gt;中的Element是参数化类型还是类?
  • 看起来BiFunction&lt;T, U, R&gt; 不遵循这个约定。如果是,那就是BiFunction&lt;T, S, R&gt;
  • 为什么要担心区分参数化类型和实际类?它们类。无论如何,您必须向上滚动文件中的某个位置以找出它们的定义。它要么是导入类型,要么是参数化类型。
【解决方案2】:

追加Type

可以在 DZone 页面上的 cmets 中找到很好的讨论,Naming Conventions for Parameterized Types

查看 Erwin Mueller 的评论。他的建议对我来说非常明显:添加单词Type

称苹果为苹果,汽车为汽车。有问题的名称是数据类型的名称,对吧? (在OOP 中,一个类本质上定义了一种新的数据类型。)所以称它为“类型”。

Mueller 的示例,取自原始帖子的文章:

public interface ResourceAccessor < ResourceType , ArgumentType , ResultType > {
    public ResultType run ( ResourceType resource , ArgumentType argument );
}

追加T

Andy Thomas 提供了一个重复的问题 this Answer。请注意 Google 样式指南的摘录,其中建议多字符类型名称应以单个大写 T 结尾。

【讨论】:

  • 我喜欢这个答案。添加“类型”非常清晰,可以让您拥有描述性名称。我厌倦了人们在没有其他理由的情况下说“这样做是因为这是惯例”。如果这是一个糟糕的约定,也许我们需要一个新的。
【解决方案3】:

是的,您可以对类型变量使用多字符名称,只要它们与类名有明显区别。

这与 Sun 在 2004 年引入泛型时建议的惯例不同。但是:

  • 存在不止一种约定。
  • 多字符名称与其他Java风格一致,如Google’s style for Java
  • 可读的名称(惊喜!)更具可读性。

可读性

在我写的一些接口中,我想用多个字符来命名泛型类型参数,以使代码更具可读性。

可读性很好。

比较:

    public final class EventProducer<L extends IEventListener<E>,E> 
            implements IEventProducer<L,E> {

到:

    public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
           implements IEventProducer<LISTENER, EVENT> {

或者,使用 Google 的多字符约定:

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

    public final class EventProducer<ListenerT extends IEventListener<EventT>,EventT> 
           implements IEventProducer<ListenerT, EventT> {

谷歌风格

Google Java Style Guide 允许单字母名称和以 T 结尾的多字符类类名称。

5.2.8 Type variable names

每个类型变量都以两种样式之一命名:

  • 一个大写字母,后跟一个数字(例如ETXT2

  • 用于类的名称(参见第 5.2.2 节,Class names),后跟大写字母 T(例如:RequestTFooBarT)。

    李>

问题

“如果没有这个约定,就很难区分类型变量和普通类或接口名称。” – 来自Oracle tutorials, “Generic types”

正如我们在上面看到的那样,单字符名称并不是区分类型参数和类名的唯一方法。

为什么不在 JavaDoc 中记录类型参数的含义?

@param JavaDoc 元素确实可以提供更长的描述。但是,JavaDocs 不一定是可见的,这也是事实。 (例如,Eclipse 中有一个显示类型参数名称的内容辅助。)

多字符类型参数名称不遵循 Oracle 约定!

Java 编程中几乎普遍遵循 Sun 的许多原始约定。

但是,这个特定的约定不是。

竞争公约中的最佳选择是见仁见智。在这种情况下,选择 Oracle 以外的约定的后果很小。您和您的团队可以选择最能满足您需求的约定。

【讨论】:

    【解决方案4】:

    您可以使用 javadoc 至少为您的泛型类的用户提供线索。我仍然不喜欢它(我同意@chaper29),但文档有所帮助。

    例如,

    /**
     * 
     * @param <R> - row
     * @param <C> - column
     * @param <E> - cell element
     */
    public class GenericTable<R, C, E> {
    
    }
    

    我知道做的另一件事是使用我的 IDE 重构一个打破惯例的类。然后处理代码并将其重构回单个字母。如果使用许多类型参数,无论如何都会让我更容易。

    【讨论】:

    • 我会说类型参数的 Javadoc cmets 通常是必须的。
    【解决方案5】:

    official naming convention推荐使用单字母的原因如下:

    没有这个约定,就很难区分 在类型变量和普通类或接口名称之间。

    我认为对于现代 IDE,这个理由不再有效,例如。 IntelliJ Idea 以不同于常规类的颜色显示泛型类型参数。

    IntelliJ Idea 2016.1 中显示的具有泛型类型的代码

    由于I use longer descriptive names 我的泛型类型的区别,与常规类型具有相同的约定。我避免添加诸如 T 或 Type 之类的前缀和后缀,因为我认为它们是不必要的干扰,并且不再需要在视觉上区分泛型类型。

    注意:由于我不是 Eclipse 或 Netbeans 的用户,我不知道它们是否提供了类似的功能。

    【讨论】:

    • 我不会根据每个人曾经读取/修改同一文件的工具的假定功能来命名约定。我个人喜欢使用不是 IDE 的文本编辑器进行编码(Sublime Text)。文本编辑器现在通常具有语法着色,但对底层代码结构的理解并不深入,我认为正确着色类型变量名称需要这些代码结构。并且基于颜色的这种论点本质上是色觉差的人所独有的(我是 8% 的红绿色盲男性中的一部分)
    • 关于色觉差的人的优点。关于不使用 IDE - 如果人们更喜欢使用简单的文本编辑器,那很好,但他们自愿牺牲 IDE 为他们提供的功能,转而使用更轻量级的工具。这可能只是缺少的那些功能之一。最后,如果使用描述性名称而不是单个字母,您应该能够在没有 IDE 和没有颜色编码的情况下根据名称来判断含义。颜色编码只是让这更快。
    • Eclipse 不会用颜色突出显示泛型类型,但它会在鼠标悬停时显示它们的 javadoc,因此定义的类 /** @param &lt;U extends Number&gt; Some parameter or other */public class Foo&lt;U&gt; { public U getValue(){ return null;}}(显然这是一个无用的示例!)将显示 'U extends Number当您将鼠标悬停在getValue() 方法返回类型的U 上时,在弹出的javadoc 窗口中作为标题和正文中的“某些参数或其他”
    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 2018-11-22
    • 2019-12-13
    • 2020-11-09
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多