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

时间:2010-05-24 22:53:39

标签: java generics naming-conventions

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

像......那样的东西。

Map<Key,Value>

而不是......

Map<K,V>

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

public void put(Key key, Value value)

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

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

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

5 个答案:

答案 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年引入仿制药的惯例不同。但是:

  • 存在多个约定。
  • 多字符名称与其他Java样式一致,例如Google’s style for 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 Type variable names

     

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

     
      
  • 单个大写字母,可选后跟一个数字(例如ETXT2

  •   
  • 用于类的表单中的名称(参见第5.2.2节,Class names),后跟大写字母T(示例:RequestTFooBarT)。

  •   

问题

  

“如果没有这种约定,很难区分类型变量和普通类或接口名称。” - 来自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中显示的具有泛型类型的代码 Code with generic type as displayed in IntelliJ Idea 2016.1

由于我的泛型类型的区别I use longer descriptive names,与常规类型具有相同的约定。我避免添加前缀和后缀,如T或Type,因为我认为它们是不必要的噪音,不再需要在视觉上区分泛型类型。

注意:由于我不是Eclipse或Netbeans的用户,我不知道他们是否提供了similliar功能。