打破java泛型命名约定?

Gen*_*zer 23 java generics naming-conventions

我有一个接口,其声明如下:

/**
* @param T - the type of entity.
* @param C - the type of entity container will be returned.
*/
public interface FindByNamedQuery<T extends Serializable, C extends Collection<T>> extends Command {
    C executeNamedQuery(String namedQuery);
}
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以(应该)打破Java命名约定来执行此操作:

public interface FindByNamedQuery<ENTITY_TYPE extends Serializable, RETURNED_CONTAINER extends Collection<ENTITY_TYPE>> extends Command {
    RETURNED_CONTAINER executeNamedQuery(String namedQuery);
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 24

我想知道我是否可以(应该)打破java命名约定来执行此操作:

不,这应该避免,因为更容易将类型参数与常量和其他标识符混淆.

以下是关于泛型的官方记录的引用:

键入参数命名约定

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

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

  • E - 元素(Java Collections Framework广泛使用)
  • K - 钥匙
  • N - 数量
  • T - 类型
  • V - 价值
  • S,U,V等-第2,第3,第4类

您将在整个Java SE API和本教程的其余部分中看到这些名称.

  • 说出类型和类名之间的区别有多难?认真.我的意思是,大多数时候你直接从IDE中读取代码(它突出显示了不同颜色的通用名称).另外,如果你是从一个愚蠢的文本编辑器中读取它,那么只需查看类的签名就可以了,并记住几分钟,这些名称指的是泛型类型. (3认同)

And*_*mas 23

从20世纪90年代中期开始使用它之后,我开始不同意单字符约定.

我觉得可读的名字更具可读性.这有助于理解泛型类型的实现和接口.

对于Java来说,模糊性问题似乎被夸大了.几个类名都是大写的.常量不在类名称的相同上下文中使用.

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

例如,比较:

public final class EventProducer<L extends IEventListener<E>,E> 
    implements IEventProducer<L,E> {
Run Code Online (Sandbox Code Playgroud)

至:

public final class EventProducer<LISTENER extends IEventListener<EVENT>,EVENT> 
    implements IEventProducer<LISTENER, EVENT> {
Run Code Online (Sandbox Code Playgroud)

虽然Sun/Oracle建议将单字符名称作为约定,但可以更改约定.挑战这一公约的后果是微不足道的.如果您和您的团队更喜欢类型参数的有意义的名称,我个人会选择它.

编辑(2015)

Google的Java风格允许使用以T结尾的单字母名称和多字符类名称.

5.2.8输入变量名称

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

  • 单个大写字母,可选地后跟单个数字(例如E,T,X,T2)

  • 用于类的形式的名称(参见第5.2.2节,类名),后跟大写字母T(示例:RequestT,FooBarT).


All*_*ice 10

使用TDescription在C#中很常见.它维护T名称,但同时也是描述性的,如下所示:

public interface FindByNamedQuery<
    TEntityType extends Serialiazble, 
    TReturnedContainer extends Collections<TEntityType>> extends Command 
{     
    TReturnedContainer executeNamedQuery(String namedQuery); 
} 
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,ALL_CAPS几乎总是表明一个常数.

IMO,"很难区分类型变量和普通类或接口名称." 这里不适用,因为T前缀很容易将其标识为类型变量.

同样,这是C#,但请参阅MSDN:泛型的命名约定

在所有其他情况下,Microsoft的官方通用命名约定指南是:

  • 使用描述性名称命名泛型类型参数,除非单个字母名称完全是自解释的,并且描述性名称不会添加值.

    public interface ISessionChannel<TSession> 
    {...}
    
    public delegate TOutput Converter<TInput,TOutput>(TInput from);
    
    Run Code Online (Sandbox Code Playgroud)
  • 考虑在参数名称中指示对类型参数的约束.例如,约束到ISession的参数可以称为TSession.