在我写的某些界面中,我想使用不止一个字符来命名通用类型参数,以使代码更具可读性。
就像是....
Map<Key,Value>
代替这个...
Map<K,V>
但是当涉及到方法时,类型参数看起来像java类,这也很令人困惑。
public void put(Key key, Value value)
这似乎是键和值是类。我发现或想到了一些符号,但没有什么比Sun的约定或最佳常规更好。
我猜或发现的替代方案...
Map<KEY,VALUE>
Map<TKey,TValue>
在我写的某些界面中,我想使用不止一个字符来命名通用类型参数,以使代码更具可读性。
就像是....
Map<Key,Value>
代替这个...
Map<K,V>
但是当涉及到方法时,类型参数看起来像java类,这也很令人困惑。
public void put(Key key, Value value)
这似乎是键和值是类。我发现或想到了一些符号,但没有什么比Sun的约定或最佳常规更好。
我猜或发现的替代方案...
Map<KEY,VALUE>
Map<TKey,TValue>
Answers:
Oracle在Java教程>泛型>泛型类型中建议以下内容:
类型参数命名约定
按照约定,类型参数名称是单个大写字母。这与变量命名形成鲜明对比您已经知道约定,并且有充分的理由:没有该约定,将很难分辨类型变量与普通类或接口名称之间的区别。
最常用的类型参数名称为:
- E-元素(由Java Collections Framework广泛使用)
- K键
- N-数字
- T型
- V-值
- S,U,V等-第二,第三,第四类型
您将在Java SE API和本课程的其余部分中看到这些名称。
我会坚持这样做以避免开发人员和可能的维护人员之间的混淆。
R用于结果和A累加器。
Elementin List<Element>是参数化类型还是类?
BiFunction<T, U, R>遵循此约定。如果是这样,那就是BiFunction<T, S, R>。
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。
建议使用单字母的正式命名约定的原因如下:
没有这种约定,将很难分辨出类型变量与普通类或接口名称之间的区别。
我认为对于现代IDE,该原因不再有效,例如。IntelliJ Idea用与常规类不同的颜色显示通用类型参数。
IntelliJ Idea 2016.1中显示的具有通用类型的代码

由于这种区别,我为我的泛型使用了更长的描述性名称,与常规类型的约定相同。我避免添加前缀和后缀(例如T或Type),因为我认为它们是不必要的噪音,并且不再需要在视觉上区分通用类型。
注意:由于我不是Eclipse或Netbeans的用户,因此我不知道它们是否提供类似功能。
是的,您可以将多字符名称用于类型变量,只要可以将它们与类名称区分开即可。
这与Sun在2004年引入泛型时提出的约定不同。但是:
在我写的某些界面中,我想使用不止一个字符来命名通用类型参数,以使代码更具可读性。
可读性好。
比较:
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> {
在谷歌的Java风格指南允许单字母名称和多字符类,像T.结尾的名称
每个类型变量都以两种样式之一命名:
单个大写字母,任选随后用单个数字(例如
E,T,X,T2)用于班级的形式名称(请参阅第5.2.2节“ 班级名称”),后跟大写字母T(例如:
RequestT,FooBarT)。
“没有这个约定,很难说出类型变量与普通类或接口名称之间的区别。” –从Oracle教程“通用类型”中
如上所述,单字符名称不是区分类型参数和类名称的唯一方法。
为什么不只在JavaDoc中记录类型参数的含义呢?
的确,@paramJavaDoc元素可以提供更长的描述。但是,JavaDoc不一定是可见的也确实如此。(例如,Eclipse中有一个内容辅助工具,用于显示类型参数名称。)
多字符类型参数名称不遵循Oracle约定!
Sun的许多原始约定几乎都在Java编程中遵循。
但是,此特定约定不是。
竞争公约之间的最佳选择是意见问题。在这种情况下,选择Oracle以外的约定的后果很小。您和您的团队可以选择最能满足您需求的约定。