打破Java泛型命名约定?

2022-09-01 19:51:47

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

/**
* @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);
}

我想知道我是否可以(应该)打破Java命名约定来做到这一点:

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

答案 1

自1990年代中期以来,我开始不同意单字符约定。

我发现可读的名称更具可读性。这有助于理解泛型类型的实现和接口。

对于Java来说,歧义问题似乎被夸大了。很少有类名全大写。常量在与类名相同的上下文中使用。

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

例如,比较 :

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

尽管 Sun/Oracle 已建议将单字符名称作为约定,但可以更改约定。对这一公约提出质疑的后果是微不足道的。如果您和您的团队更喜欢有意义的名称作为类型参数,我个人会选择它。

编辑 (2015)

Java的Google样式允许以T结尾的单字母名称和多字符类名称。

5.2.8 类型变量名称

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

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

  • 用于类的格式的名称(请参见第 5.2.2 节, 类名),后跟大写字母 T(例如:RequestT、FooBarT)。


答案 2

我想知道我是否可以(应该)打破java命名约定来做到这一点:

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

以下是关于泛型的官方线索的引用:

类型参数命名约定

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

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

  • E - 元素(由 Java 集合框架广泛使用)
  • K - 键
  • N - 数字
  • T - 类型
  • V - 值
  • SUV 等 - 第 2、3、4 种

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