在我写的一些接口中,我想用多个字符命名泛型类型参数,以使代码更具可读性。
像......那样的东西。
Map<Key,Value>
而不是......
Map<K,V>
但是当谈到方法时,类型参数看起来像java-classes,这也令人困惑。
public void put(Key key, Value value)
这看起来像Key和Value是类。我发现或想到了一些符号,但没有像Sun的惯例或一般的最佳实践。
我猜测或发现的替代品......
Map<KEY,VALUE>
Map<TKey,TValue>
答案 0 :(得分:167)
Oracle建议在Java Tutorials > Generics > Generic Types中使用以下内容:
类型参数命名约定
按照惯例,类型参数名称是单个大写字母。这与您已经了解的变量naming约定形成鲜明对比,并且有充分的理由:如果没有这种约定,就很难区分类型变量和普通类或接口名称。< / p>
最常用的类型参数名称是:
- E - Element(Java Collections Framework广泛使用)
- K - Key
- N - 数字
- T - Type
- V - 值
- S,U,V等 - 第2,第3,第4类
您将在整个Java SE API和本课程的其余部分中看到这些名称。
我坚持不懈,以避免开发人员和可能的维护人员之间的混淆。
答案 1 :(得分:40)
Type
可以在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
结尾。
答案 2 :(得分:16)
是的,您可以为类型变量使用多字符名称,只要它们与类名明确区分开来。
这与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> {
Google Java Style Guide允许单字母名称和以T结尾的多字符类名称。
<强> 5.2.8 Type variable names 强>
每个类型变量都以两种样式之一命名:
单个大写字母,可选后跟一个数字(例如
E
,T
,X
,T2
)用于类的表单中的名称(参见第5.2.2节,Class names),后跟大写字母T(示例:
RequestT
,FooBarT
)。
“如果没有这种约定,很难区分类型变量和普通类或接口名称。” - 来自Oracle tutorials, “Generic types”
单字符名称不是区分类型参数和类名的唯一方法,正如我们上面所见。
为什么不直接记录JavaDoc中的类型参数?
@param
JavaDoc元素确实可以提供更长的描述。但是,JavaDocs也不一定是可见的。 (例如,Eclipse中有一个显示类型参数名称的内容辅助。)
多字符类型参数名称不符合Oracle惯例!
Sun的许多原始约定几乎普遍遵循Java编程。
但是,这个特殊的惯例不是。
竞争公约中的最佳选择是意见问题。在这种情况下,选择Oracle以外的约定的后果很小。您和您的团队可以选择最符合您需求的惯例。
答案 3 :(得分:15)
您可以使用javadoc至少为您的泛型类的用户提供线索。我仍然不喜欢它(我同意@ chaper29),但文档有帮助。
例如
/**
*
* @param <R> - row
* @param <C> - column
* @param <E> - cell element
*/
public class GenericTable<R, C, E> {
}
我所知道的另一件事是使用我的IDE来重构违反约定的类。然后处理代码并重构为单个字母。如果使用许多类型参数,无论如何都会使我更容易。
答案 4 :(得分:14)
official naming convention使用单个字母重新命名的原因如下:
如果没有这种惯例,就很难区分它们 在类型变量和普通类或接口名称之间。
我认为在现代IDE中,理性不再有效,例如。 IntelliJ Idea显示具有与常规类不同颜色的泛型类型参数。
IntelliJ Idea 2016.1中显示的具有泛型类型的代码
由于我的泛型类型的区别I use longer descriptive names,与常规类型具有相同的约定。我避免添加前缀和后缀,如T或Type,因为我认为它们是不必要的噪音,不再需要在视觉上区分泛型类型。
注意:由于我不是Eclipse或Netbeans的用户,我不知道他们是否提供了similliar功能。