大多数面向对象语言的接口名称都以大写的I开头,为什么Java不这样做呢?不遵循这一惯例的理由是什么?

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

类=用户,接口= UserInterface 类= UserImpl,接口=用户

在大多数语言中:

类=用户,接口= IUser

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

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


当前回答

在c#中是这样的

public class AdminForumUser : UserBase, IUser

Java会说

public class AdminForumUser extends User implements ForumUserInterface

正因为如此,我认为在java中,约定对于接口来说并没有那么重要,因为继承和接口实现之间有明显的区别。我会说选择任何你喜欢的命名约定,只要你是一致的,并使用一些东西向人们展示这些是接口。我已经好几年没有使用java了,但是所有的接口都在它们自己的目录下,这是惯例。从来没有什么问题。

其他回答

这是真正意义上更广泛的命名惯例吗?我更倾向于c++,而不是Java及其后代。有多少语言社区使用I约定?

如果这里有独立于语言的商店标准命名约定,请使用它。如果不是,请遵循语言命名约定。

在c#中是这样的

public class AdminForumUser : UserBase, IUser

Java会说

public class AdminForumUser extends User implements ForumUserInterface

正因为如此,我认为在java中,约定对于接口来说并没有那么重要,因为继承和接口实现之间有明显的区别。我会说选择任何你喜欢的命名约定,只要你是一致的,并使用一些东西向人们展示这些是接口。我已经好几年没有使用java了,但是所有的接口都在它们自己的目录下,这是惯例。从来没有什么问题。

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

前缀损害了可读性。 在客户端中使用接口是编程的标准最佳方式,因此接口名称应该尽可能简短而美观。实现类应该更加丑陋,以阻止它们的使用。 当从抽象类更改为接口时,前缀为I的编码惯例意味着重命名类的所有出现项——这不好!

鲍勃·李曾在一次演讲中说:

接口的意义是什么,如果你 只有一个实现。

因此,您从一个实现开始,即没有接口。 稍后,您决定这里需要一个接口,因此您将类转换为接口。

那么很明显:你原来的类叫User。你的界面现在被称为User。也许你有一个UserProdImpl和一个UserTestImpl。如果你的应用程序设计得很好,每个类(除了实例化User的类)都不会改变,不会注意到它们突然被传递了一个接口。

接口用户实现UserImpl。

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

Part of the Object-Oriented approach is that you should not have to know whether the client is using an interface or an implementation class. So, even List is an interface and String is an actual class, a method might be passed both of them - it doesn't make sense to visually distinguish the interfaces. In general, we will actually prefer the use of interfaces in client code (prefer List to ArrayList, for instance). So it doesn't make sense to make the interfaces stand out as exceptions. The Java naming convention prefers longer names with actual meanings to Hungarian-style prefixes. So that code will be as readable as possible: a List represents a list, and a User represents a user - not an IUser.