接口中的字段

643ylb08  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(576)

我有一个java中的基本问题,但它是oop中的一个通用问题。为什么接口允许设置字段?这是否与接口应该做的相反?
按照我的理解,介面就是英语中的形容词。因此,如果我的类实现了runnable和serializable接口,那么我要确保用户我的类将满足runnable和serializable的条件。然而,这意味着接口是“无状态的”,但是允许它们在java中有字段。。。
我错过什么了吗?

ebdffaop

ebdffaop1#

接口中的所有字段都是 public static final ,即它们是常量。
通常建议避免使用此类接口,但有时可以找到一个没有方法且仅用于包含常量值列表的接口。

ct2axkht

ct2axkht2#

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

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);
}
oug3syen

oug3syen3#

是的,在接口中可以有常量字段,但如果您说“这似乎与接口应该做的相反”,则是对的,因为这不是一个好的实践。为什么要让所有类实现具有相同常量的接口?您可以简单地将它们放在使用它们的类中,或者如果确实需要以某种方式导出它们,则将它们放在单独的类实用程序中,如下所示:

public class Constants {
    private Constants() { }

    public static final int ZERO = 0;
    public static final int SOME_COMPLEX_NUM = 2124132L;
    ...
}

如果需要表示一组具有某种意义的常量字段,那么还可以使用枚举。我没有看到任何“用例”在接口中实际需要常量。但可能是错的:)

kpbwa7wx

kpbwa7wx4#

首先,oop范例和java中的oop实现之间有区别,所以相同的词可能意味着一些不同的东西。
在oop中,范例接口是您可以对对象做什么(或者对象可以为您做什么)。任何对象都可以有多个接口,从而扮演不同的角色。例如,有人可能是一名程序员,能够创建程序,但同时他可能是一个丈夫和父亲,因此能够支付家庭账单和照顾孩子。在这里,“程序员”、“丈夫”和“父亲”是接口,而人是实现它们的对象。请注意,接口并不意味着存在用于实现对象的任何特定特性(字段),只是该对象应该能够执行的操作。
java或多或少地遵循了这个思想,但是作为任何范例,实现都有自己的特性。java允许描述方法,也就是实现对象应该能够执行的操作,但不允许描述任何实现细节,因此,不允许描述对象字段或私有方法。
但是常数呢( public final static 字段)?它们是实现或接口的一部分。两者都有可能。e、 接口“程序员”可以有常数 WORK_HOURS 设置为“8”。因此,java也允许您描述接口中的常量。
请注意,java只帮助您进行良好的oop设计,但并不强烈要求这样做。特别是,不是所有对象的公共方法都应该存在于接口中。例如,getter和setter方法通常是公共的,但实际上它们是实现的一部分,而不是接口,因此不将它们引入接口是值得的。
(还请注意,我在这里描述的大多数东西都是关于主流oop的,比如java,但是也有其他类型的oop,比如基于原型的oop,特别是用javascript实现的oop)。

相关问题