接口中的字段

Sal*_*Sal 48 java oop interface

我在Java中有一个基本问题,但这是OOP中的一个普遍问题.为什么接口允许设置字段?这不是一个接口应该做的事情吗?

我理解它的方式,界面是英语中的形容词.因此,如果我的类实现了Runnable和Serializable接口,那么我确保用户我的类将满足条件为Runnable和Seriablizable.但是,这意味着接口是"无状态的",但允许它们在Java中有字段...

我错过了什么吗?

And*_*nov 60

接口中的所有字段都是public static final,即它们是常量.

通常建议避免使用此类接口,但有时您可以找到没有方法的接口,并且仅用于包含常量值列表.

  • 回答“为什么你会说避免使用带有常量的接口”,因为设计方面这不是一个好的实践,如果你想定义常量,只需创建一个 Enum 类并在那里定义它们,它更符合逻辑和整洁。在我看来,实现一个接口来使用常量是没有意义的,那是臃肿的代码。 (4认同)
  • @MuhammedOzdogan,你可以看到《Effective Java》的第22条:“仅使用接口来定义类型”:“常量接口模式是对接口的不良使用。类在内部使用一些常量是一个实现细节。实现常量接口导致此实现细节泄漏到类的导出 API 中。” (2认同)

ffr*_*end 20

首先,在OOP范例Java中的OOP实现之间存在差异,因此相同的单词可能意味着有点不同.

在OOP中,范例界面是您可以对对象(或者对象可以为您做什么)所做的事情.任何对象都可以有多个接口,从而扮演不同的角色.例如,某人可以作为程序员工作并且能够创建程序,但同时他可能是丈夫和父亲,因此能够为他的家庭支付账单并照顾孩子.这里"程序员","丈夫"和"父亲"是接口,而人是实现它们的对象.注意,接口并不意味着存在用于实现对象的任何特定功能(字段),只是该对象应该能够执行的操作.

Java或多或少遵循这个想法,但任何范例实现都有自己的特性.Java允许描述方法,即实现对象应该能够执行的操作,而不是任何实现细节,因此,没有关于对象字段或私有方法.

但是常数(public final static字段)呢?它们是实现或接口的一部分.它可能都是.例如,接口"programmer"可以将常量WORK_HOURS设置为"8".因此,Java允许您在接口中描述常量.

请注意,Java只能帮助您进行良好的OOP设计,但并不强烈要求它.特别是,并非对象的所有公共方法都应该存在于接口中.例如,getter和setter方法通常是公共的,但实际上它们是实现一部分,而不是接口,因此不值得将它们引入接口.

(请注意,我在这里描述的大多数内容都与Java中的主流OOP有关,但也有其他类型的OOP,例如基于原型的OOP,特别是在JavaScript中实现的).


mer*_*ike 7

如果该接口引用常量怎么办?在接口中声明它们不是很自然吗?

interface IdFinder {
    Serializable UNSAVED = new Serializable() {};

    /** @returns the given entity's persistent identity, 
                 or {@link UNSAVED} if it hasn't been saved yet, 
                 or null if o is a value object that hasn't a 
                 persistent identity of its own.
     */
    Serializable getId(Object o);
}
Run Code Online (Sandbox Code Playgroud)