首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中的接口命名

Java中的接口命名
EN

Stack Overflow用户
提问于 2009-02-12 15:51:33
回答 11查看 227.3K关注 0票数 351

大多数面向对象语言的接口名称前面都有一个大写的I,为什么Java不这样做呢?不遵循这个约定的理由是什么?

为了演示我的意思,如果我想要有一个用户界面和一个用户实现,我在Java中有两个选择:

用户类=用户,接口= UserInterface

  • Class = UserImpl,接口=用户

在大多数语言中:

类=用户,接口= IUser

现在,您可能会争辩说,您总是可以为用户实现选择一个最具描述性的名称,这样问题就解决了,但是Java正在推动POJO方法,并且大多数IOC容器都广泛使用DynamicProxies。这两件事结合在一起意味着您将拥有许多具有单个POJO实现的接口。

因此,我想我的问题可以归结为:“是否值得遵循更广泛的接口命名约定,尤其是考虑到框架的发展趋势?”

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-02-12 16:23:44

我不喜欢在接口上使用前缀:

前缀会伤害客户端中的readability.

  • Using接口,这是标准的最佳编程方式,因此接口名称应该尽可能简短和友好。实现类应该更丑陋,以阻止它们的使用。

  • 当从抽象类更改为接口时,带有前缀i的编码约定意味着重命名类的所有实例-不好!
票数 355
EN

Stack Overflow用户

发布于 2009-02-12 16:05:13

是否真的有区别:

代码语言:javascript
复制
class User implements IUser

代码语言:javascript
复制
class UserImpl implements User

如果我们讨论的都是命名约定呢?

就我个人而言,我不喜欢在接口之前使用I,因为我希望对接口进行编码,并且我认为这在命名约定方面更重要。如果调用接口IUser,那么该类的每个使用者都需要知道它是一个IUser。如果你调用类UserImpl,那么只有类和你的DI容器知道Impl部件,而消费者只知道他们使用的是User

再一次,我因为一个更好的名字没有出现而被迫使用Impl的次数很少,因为实现是根据实现来命名的,因为这是它的重要之处。

代码语言:javascript
复制
class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
票数 129
EN

Stack Overflow用户

发布于 2009-02-12 16:17:17

Java通常不使用IUser约定可能有几个原因。

  1. 是面向对象方法的一部分,您不必知道客户端使用的是接口还是实现类。因此,即使List是一个接口,String是一个实际的类,一个方法可能会同时传递给这两个类--在视觉上区分这两个接口是没有意义的。
  2. 一般来说,我们实际上更喜欢在客户端代码中使用接口(例如,比起ArrayList,我们更喜欢使用List )。因此,让接口脱颖而出是没有意义的,因为exceptions.
  3. The Java命名约定更喜欢具有实际含义的较长名称,而不是匈牙利风格的前缀。因此代码将尽可能具有可读性:列表代表列表,用户代表用户-而不是IUser。
票数 81
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/541912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档