用于 Java 的泛型参数变数命名原则(包含多个字符) ?

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

好像是..。

Map<Key,Value>

而不是这样。

Map<K,V>

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

public void put(Key key, Value value)

这看起来好像键和值是类。我找到或想到了一些注释,但没有什么像 Sun 的约定或一般的最佳实践。

我猜测或发现的替代方案。

Map<KEY,VALUE>
Map<TKey,TValue>
76153 次浏览

Oracle 在 Java 教程 > 泛型 > 泛型类型中建议:

类型参数命名约定

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

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

  • E-Element (Java集合框架广泛使用)
  • K-Key
  • 号码
  • T 型
  • V 值
  • S,U,V 等-第二,第三,第四类

您将在 JavaSEAPI 和本课余下的部分中看到这些名称的使用。

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

可以使用 javadoc 至少为泛型类的用户提供一些线索。我仍然不喜欢它(我同意@chaper29) ,但是医生们帮助了我。

例如,

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


}

我知道的另一件事是使用 IDE 重构一个打破约定的类。然后处理代码并重构回单个字母。如果使用许多类型参数,对我来说会更容易。

附录 Type

在 DZone 页面 参数化类型的命名约定的评论中可以找到一个很好的讨论。

看看 Erwin Mueller 的评论,他的建议对我来说非常有意义: 附加单词 Type

把苹果叫苹果,把汽车叫汽车。问题中的名称是数据类型的名称,对吗?(在 中,类实际上定义了一个新的数据类型。)那就称之为“类型”吧。

穆勒的例子来自最初的文章:

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

附录 T

一个重复的问题提供 这个答案由安迪托马斯。请注意 Google 风格指南的摘录,其中建议多字符类型名称应以单个大写字母 T结尾。

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

这与 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> {

或者,按照谷歌的多字符惯例:

    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 结尾的单字母名称和多字符类名称。

5.2.8输入变量名

每个类型变量以两种样式中的一种命名:

  • 一个大写字母,后面可以跟一个数字(如 ETXT2)

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

问题

如果没有这个约定,就很难区分类型变量和普通类或接口名称之间的区别从 Oracle 教程,“泛型类型”

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

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

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

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

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

然而,这个特殊的约定不是。

在相互竞争的约定中,最好的选择是一个观点问题。在这种情况下,选择 Oracle 以外的其他约定的后果是微不足道的。您和您的团队可以选择最符合您需要的约定。

官方变数命名原则建议使用单个字母的原因如下:

如果没有这个约定,就很难区分这两者的区别 类型变量与普通类或接口名称之间的。

我认为在现代 IDE 中,理性不再像例如。IntelliJ Ideas 显示了与常规类不同颜色的泛型类型参数。

具有泛型类型的代码,如 IntelliJ Ideas 2016.1中所示 Code with generic type as displayed in IntelliJ Idea 2016.1

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

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