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的代码
由于这个区别, 我使用较长的描述性名称作为我的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都以两种样式之一进行命名:
单个大写字母(可选地跟有单个数字(例如
E
,T
,X
,T2
)用于类的forms的名称(见第5.2.2节, 类名 ),后跟大写字母T(示例:
RequestT
,FooBarT
)。
问题
“如果没有这个约定,就很难区分typesvariables和普通类或接口名称之间的区别。” – 来自Oracle教程的“genericstypes”
正如我们上面所看到的,单字符名称并不是区分类名称的唯一方法。
为什么不只是在JavaDoc中loggingtypes参数的含义呢?
确实,@ @param
JavaDoc元素可以提供更长的描述。 但是,JavaDocs不一定是可见的。 (例如,Eclipse中有一个内容帮助,显示了types参数名称。)
多字符types参数名称不遵循Oracle约定!
在Java编程中,Sun的许多原始约定几乎都被遵循。
但是,这个特定的约定不是。
竞争公约之间的最佳select是一个意见。 在这种情况下,selectOracle以外的其他协议的后果是微不足道的。 您和您的团队可以select最符合您需求的会议。