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

问题

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

就像是....

Map<Key,Value>

而不是......

Map<K,V>

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

public void put(Key key, Value value)

这看起来像Key和Value是类。我发现或想到了一些符号,但没有像Sun的惯例或一般的最佳实践。

我猜测或发现的替代品......

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

#1 热门回答(154 赞)

Oracle建议在Java Tutorials > Generics > Generic Types中进行以下操作:

类型参数命名约定按照惯例,类型参数名称是单个大写字母。这与你已经了解的变量命名约定形成鲜明对比,并且有充分的理由:如果没有这种约定,就很难区分类型变量和普通类或接口名称。最常用的类型参数名称是:E - Element(Java Collections Framework广泛使用)K - Key N - Number T - Type V - Value S,U,V等 - 第2,第3,第4类型你会请参阅Java SE API和本课程其余部分中使用的这些名称。

我坚持这样做是为了避免开发人员和可能的维护者之间的混淆。


#2 热门回答(32 赞)

#追加类型

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

请参阅Erwin Mueller的评论。他的建议对我来说非常明显:附加单词Type

叫一个苹果一个苹果,一辆车开车。有问题的名称是数据类型的名称,对吧? (在OOP中,类本质上定义了一种新的数据类型。)因此将其称为"类型"。

穆勒的例子,来自原帖的文章:

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

#追加T.

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


#3 热门回答(14 赞)

是的,你可以对类型变量使用多字符名称,只要它们与类名明确区分即可。

这与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风格

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

5.2.8类型变量名称每个类型变量都以两种样式之一命名:单个大写字母,可选地后跟单个数字(例如E,T,X,T2)用于类的表单中的名称(请参阅第5.2.2节,类名称),后跟大写字母T(例如:RequestT,FooBarT)。

##问题

"如果没有这种约定,就很难区分类型变量和普通类或接口名称。" - 来自Oracle教程,"通用类型"

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

为什么不直接记录JavaDoc中的类型参数?

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

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

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

但是,这个特殊的惯例不是。

竞争公约中的最佳选择是意见问题。在这种情况下,选择Oracle以外的约定的后果很小。你和你的团队可以选择最符合你需求的会议。