Java接口、抽象类和枚举的命名规范

32

我们团队正在讨论Java代码规范的问题:

  • interfaceFooIFoo还是FooInterface

  • abstractFoo还是AbstractFoo

  • EnumsFoo还是FooEnum

我想把个人偏好放在一边,因此欢迎提供支持某种规范的理由。

9个回答

35
在Java中:`Foo`,`AbstractFoo`和`Foo` - 尽管`AbstractFoo`可以只是`Foo`。
证据:
- `java.util.List`(接口) - `java.util.AbstractList`(抽象类) - `java.util.Formatter.BigDecimalLayoutForm`(枚举)
关于接口部分,请参见Java编码约定文档的Naming Conventions部分。不过,它并没有提到枚举和抽象类。

1
就我所知,接口遵循 JavaBeans 命名规范,该规范规定接口应命名为形容词,通常以 able 结尾。因此,如果 Foo 是一个动作,则接口应命名为 Fooable - Rudi Kershaw
@RudiKershaw:并不总是这样...我的经验是随着时间的推移,这种情况已经减少了。反例包括CharSequence、所有集合、各种DOM接口。 - Jon Skeet
JavaBeans的约定只适用于为插件可重用软件组件编写的代码,因此许多约定似乎在标准用途中被大量忽略。但是我喜欢使用“Fooable”命名,因为它可以帮助我一眼区分普通类。 - Rudi Kershaw
糟糕!Sun被Oracle收购了。:( - user1459961

22

来自我的博客:

  • Foo - 接口最终定义了概念,因此它应具有最好的名称。
  • AbstractFoo - 旨在用作类层次结构的基础的抽象实现。
  • BaseFoo - 旨在用作类层次结构的基础的实现,在必要时可以单独使用基类。
  • DefaultFoo - “默认”实现适用于大多数典型用例。
  • SimpleFoo - “简单”实现没有意外功能,例如示例或模拟。一个简单的POJO将是一个好的“简单”实现。
  • {描述性}Foo - 其他实现应该描述它们的独特之处。

博客还讨论了一些其他名称不合适的原因。


19

接口: Foo

原因:你的代码不需要知道它们正在处理一个接口。编写“IFoo”就是这样。相反,“Foo”清楚地表明“Foo”是通用的,其后面的对象可能是“NumFoo”或“StrFoo”。代码确实不需要关心。

抽象类: AbstractFoo

原因:你的代码永远不会直接使用这个类。你将始终通过子类化此类来创建由其他代码使用的任何类。因此,程序员必须充分清楚该类是抽象的。最好的命名方式是使用Abstract!在需要使用AbstractFoo类型引用的地方,应重新考虑是否使用接口。(当然,在C++中这是不可能的)

枚举: FooType 或 FooEnum。就我个人而言,FooType更好,因为Type更容易与“现实世界”相关联。

干杯!


5

没有特殊的约定。

对于这种类型的类,使用特殊的命名约定基本上是匈牙利记法(不好的那种):它所提供的信息已经存在于语法中,并且通常在IDE(如当您悬停在名称上时)中很容易获得。将其放入名称本身是毫无意义和丑陋的。

类名应该尽可能清楚地描述类的角色。这样做可以导致“自然”的命名约定 - Java命名接口以-able后缀命名就是一个非常好的例子(例如Iterable、Comparable)- 但如果它被普遍强制执行,并且List、Map等必须遵循它,我不想想象结果会是什么样子。


1
但是如果您有许多相似的功能类呢? 规范使您不必浪费有意义的名称。对于Foo类分支,您只需使用IFoo、AbstractFoo、Foo、ExtendedFoo和Happy,而没有规范,您会选择什么名称呢? Foo、Foo2、Foo3、SuperFoo? - Imaskar
1
没有规定并不意味着你不能这样命名类,只是你不必在任何地方都使用这样的名称。但在你的例子中,我会将Foo作为接口,AbstractFoo是必要的,因为接口和类共享相同的命名空间,但具体的类应该有描述它们具体方面的独特名称。 - Michael Borgwardt
2
一个Java的例子:Map是接口,然后有AbstractMap、HashMap、TreeMap、LinkedHashMap等等... - Michael Borgwardt

3

我的规范:

  • 接口: Foo
  • 抽象类: 根据具体情况使用FooAdaptor、AbstractFoo或BaseFoo
  • 枚举: Foo或Foos

我真的不喜欢在接口名称中使用"I"甚至是FooInterface:

 interface FooInterface {

就像写作一样:

 class FooClass {

甚至可以:
 abstract class AbstractFooClass {

这只是一种冗长的表达方式。


类名通常应该是单数名词。因此,Foos 可能不是枚举的好名称(尽管 Foo 是)。 - James
@James,您可以在您上句话中划掉“可能”这个词。 - Torsten

2

就我个人而言,我喜欢的接口有:

Fooable

Fooable是指对它进行foo操作,其中“foo”是一个动词。 - Adam Hošek

2

我的约定:

  • 接口: Foo
  • 抽象类: AbstractFoo
  • 枚举:通常为Foo,但在某些情况下为FooType

IFoo非常 .Net,不是Java。我从未见过使用FooInterface


IFoo 在 Eclipse 代码库中也被广泛使用,Eclipse 是一个非常 Java 的平台,但它们很可能从 .NET 中借鉴了这个概念。 - Peter Dolberg
1
虽然我指出它在Eclipse中被使用,但我并不推荐它。事实上,我更喜欢Foo而不是IFoo。 - Peter Dolberg
此外,尽管Eclipse是用Java编写的,但这并不意味着他们使用了Java风格。 - Cephalopod

1
关于接口:
我更喜欢IFoo,因为它是一个直白的名字,一下子就告诉你它是一个接口。 其次,在模块等地方,你只需要为一个类创建一个接口时,这个类通常与接口同名。然后你可以使用Foo extends IFoo。否则,你得找一个名字。或者使用FooInterface或其他什么……
如java.util.list所述,使用Foo没有问题,因为不同概念的类实现了它,从而已经暗示了不同的名称(ArrayList、LinkedList等)。 我不确定我是否真的更喜欢IList。不知道……:P

1
在大多数情况下,一个类型是类还是接口并不重要;但是如果你的类和接口具有相同的名称,那可能是设计不良的迹象。 - Cephalopod

-2

иҝҷжҳҜжҲ‘еңЁIONдёӯDEVеӣўйҳҹдҪҝз”Ёзҡ„зәҰе®ҡгҖӮ

жҺҘеҸЈ

interface IMyInterface

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

abstract class MyAbstract

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

enum EMyEnumeration

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


这是在ION Trading Inc.吗?MarketView的制造商? - endless
1
听起来像是我不想为之工作的那种公司 :-) - Jonathan E. Landrum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接