Java的genericstypes参数命名约定(带多个字符)?

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

就像是….

Map<Key,Value> 

而不是这个…

 Map<K,V> 

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

 public void put(Key key, Value value) 

这似乎是关键和价值是类。 我发现或想到了一些符号,但没有像太阳或一般的最佳做法的惯例。

替代品我find或find…

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

Oracle在Java教程>generics>generics中推荐以下内容:

input参数命名约定

按照惯例,types参数名称是单个大写字母。 这与你已经知道的variables命名约定形成了鲜明的对比,并且有很好的理由:如果没有这个约定,就很难区分typesvariables和普通类或接口名称。

最常用的types参数名称是:

  • 电子元素(广泛用于Java集合框架)
  • K – 键
  • N – 数字
  • T型
  • V – 值
  • S,U,V等 – 二,三,四类

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

我会坚持下去,以避免开发人员和可能的维护人员之间的混淆。

追加Type

在DZone页面的注释中可以find一个很好的讨论,参数化types的命名约定 。

请参阅Erwin Mueller的评论。 他的build议对我来说是完全明显的意义: 追加单词Type

叫一个苹果,一辆车一辆车。 有问题的名称是数据types的名称,对不对? (在OOP中 ,一个类本质上定义了一个新的数据types。)所以称之为“types”。

从原始文章的文章中得出穆勒的例子:

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

追加T

一个重复的问题提供了这个答案安迪托马斯。 请注意,Google的样式指南摘录了一个多字符types的名称应该以单个大写T结尾。

你可以使用javadoc至less给你的generics类的用户一个线索。 我仍然不喜欢(我同意@ chaper29),但文档有帮助。

例如,

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

我已经知道的另一件事是使用我的IDE来重构一个打破惯例的类。 然后处理代码并重构为单个字母。 无论如何,如果使用许多types参数,使我更容易。

官方命名惯例之所以使用单个字母来推荐,原因如下:

没有这个约定,很难区分typesvariables和普通类或接口名称之间的区别。

我认为与现代IDE的理由是不再有效的例如。 IntelliJ Idea使用不同于常规类的颜色显示genericstypes参数。

IntelliJ Idea 2016.1中显示的具有genericstypes的代码 IntelliJ Idea 2016.1中显示的具有泛型类型的代码

由于这个区别, 我使用较长的描述性名称作为我的genericstypes,与常规types具有相同的约定。 我避免添加前缀和后缀,如T或Type,因为我认为它们是不必要的噪音,不再需要在视觉上区分generics。

注意:因为我不是Eclipse或Netbeans的用户,所以我不知道他们是否提供similliarfunction。

是的,只要与类名明确区分,就可以使用多字符名称作为typesvariables。

这与Sun于2004年推出的仿制药不同,但是:

  • 存在多于一个的公约。
  • 多字符名称与其他Java风格是一致的,例如Google的Java风格 。
  • 可读的名字是(惊喜!)更具可读性。

可读性

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

可读性很好。

比较:

  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风格指南允许使用单字母名称和以T结尾的多字符类名称。

5.2.8inputvariables名称

每个typesvariables都以两种样式之一进行命名:

  • 单个大写字母(可选地跟有单个数字(例如ETXT2

  • 用于类的forms的名称(见第5.2.2节, 类名 ),后跟大写字母T(示例: RequestTFooBarT )。

问题

“如果没有这个约定,就很难区分typesvariables和普通类或接口名称之间的区别。” – 来自Oracle教程的“genericstypes”

正如我们上面所看到的,单字符名称并不是区分类名称的唯一方法。

为什么不只是在JavaDoc中loggingtypes参数的含义呢?

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

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

在Java编程中,Sun的许多原始约定几乎都被遵循。

但是,这个特定的约定不是。

竞争公约之间的最佳select是一个意见。 在这种情况下,selectOracle以外的其他协议的后果是微不足道的。 您和您的团队可以select最符合您需求的会议。