Java(带有多个字符)的通用类型参数命名约定?


124

在我写的某些界面中,我想使用不止一个字符来命名通用类型参数,以使代码更具可读性。

就像是....

Map<Key,Value>

代替这个...

Map<K,V>

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

public void put(Key key, Value value)

这似乎是键和值是类。我发现或想到了一些符号,但没有什么比Sun的约定或最佳常规更好。

我猜或发现的替代方案...

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

9
为什么要创建一个新的约定?
阿米尔·阿富汗尼

13
@AmirAfghani来自问题:使代码更具可读性。
SantiBailors 2015年

从技术上讲,IDE中泛型的不同色调应足以说明问题
Sudix

Answers:


181

Oracle在Java教程>泛型>泛型类型中建议以下内容:

类型参数命名约定

按照约定,类型参数名称是单个大写字母。这与变量命名形成鲜明对比您已经知道约定,并且有充分的理由:没有该约定,将很难分辨类型变量与普通类或接口名称之间的区别。

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

  • E-元素(由Java Collections Framework广泛使用)
  • K键
  • N-数字
  • T型
  • V-值
  • S,U,V等-第二,第三,第四类型

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

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


14
新的流框架还R用于结果和A累加器。
vandale 2014年

32
Blech,单字母命名。我遵循这个约定,是因为约定比描述性名称更重要,但是很遗憾,这是他们能想到的最好的方法。
warbaker

4
@warbaker:我发现这是区分参数化类型与实际类的好方法。您将如何判断例如Elementin List<Element>是参数化类型还是类?
BalusC 2014年

1
它看起来不像BiFunction<T, U, R>遵循此约定。如果是这样,那就是BiFunction<T, S, R>
michaelsnowden '16

4
为什么要担心将参数化类型与实际类区分开?他们课程。无论如何,您都必须向上滚动文件中的某处以查找它们的定义。它可以是导入类型或参数化类型。
Vectorjohn

47

附加 Type

可以在DZone页面上的注释“参数化类型的命名约定”中找到很好的讨论。

参见Erwin Mueller的评论。他的建议对我来说是完全显而易见的:附加这个词Type

称苹果为苹果,汽车称为汽车。有问题的名称是数据类型的名称,对吗?(在OOP中,类本质上定义了新的数据类型。)因此将其称为“类型”。

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

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

附加 T

重复的问题提供了Andy Thomas的答案。请注意Google风格指南的摘录,该摘录建议多字符类型名称应以单个大写字母结尾T


3
我喜欢这个答案。添加“类型”非常清楚,可以使用描述性名称。我讨厌别人说“这样做是因为这是惯例”,没有其他理由。如果这是一个不好的约定,也许我们需要一个新的约定。
画了

16

建议使用单字母的正式命名约定的原因如下:

没有这种约定,将很难分辨出类型变量与普通类或接口名称之间的区别。

我认为对于现代IDE,该原因不再有效,例如。IntelliJ Idea用与常规类不同的颜色显示通用类型参数。

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

由于这种区别,为我的泛型使用了更长的描述性名称,与常规类型的约定相同。我避免添加前缀和后缀(例如T或Type),因为我认为它们是不必要的噪音,并且不再需要在视觉上区分通用类型。

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


我不会基于每个人阅读/修改相同文件所具有的工具的假定功能来命名约定。我个人喜欢使用不是IDE的文本编辑器(Sublime Text)进行编码。如今,文本编辑器通常具有语法着色功能,但对底层代码结构的理解还不够深入,我认为正确地为变量名称键入颜色将需要这些代码结构。基于颜色的论点本质上是色觉不佳的人所专有的(我是有8%的红绿色色盲男性的一部分)
joonas.fi

1
对于视力不好的人来说是个好主意。关于不使用IDE-如果人们喜欢使用简单的文本编辑器,那很好,但是他们自愿牺牲了IDE提供给他们的功能,而希望使用更轻便的工具。这可能只是缺少的功能之一。最后,如果使用描述性名称而不是单个字母,那么您应该能够在没有IDE且没有颜色编码的情况下根据名称来说明含义。颜色编码只会使速度更快。
Vojtech Ruzicka,

16

是的,您可以将多字符名称用于类型变量,只要可以将它们与类名称区分开即可。

这与Sun在2004年引入泛型时提出的约定不同。但是:

  • 存在多个约定。
  • 多字符名称与其他Java样式一致,例如Google的 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风格指南允许单字母名称和多字符类,像T.结尾的名称

5.2.8类型变量名称

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

  • 单个大写字母,任选随后用单个数字(例如ETXT2

  • 用于班级的形式名称(请参阅第5.2.2节“ 班级名称”),后跟大写字母T(例如:RequestTFooBarT)。

问题

“没有这个约定,很难说出类型变量与普通类或接口名称之间的区别。” –从Oracle教程“通用类型”中

如上所述,单字符名称不是区分类型参数和类名称的唯一方法。

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

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

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

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

但是,此特定约定不是。

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


15

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

例如,

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

}

我知道做的另一件事是使用我的IDE重构违反约定的类。然后处理代码并重构回单个字母。无论如何,如果使用许多类型参数,这对我来说都很容易。


1
我会说类型参数的Javadoc注释通常是必须的。
migu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.