我只是想明白为什么所有领域中所定义的接口是隐含地 staticfinal.的想法保持领域 static 对我来说很有意义因为你不能拥有对象的一个接口,但是他们为什么 final (隐含的)?

任何人知道为什么Java设计师去与制领域中的一个接口 staticfinal?

有帮助吗?

解决方案

,因为它意在仅指定的交互合同,没有实现细节的接口不能有行为或状态。无行为是不容许的方法/构造器或静态/实例初始化块执行。无状态是由只允许静态最终fields.Therefore,类可以具有的状态(静止状态)强制执行,但由接口实例状态不推断。

顺便说一句:Java中的常数由静态最终字段定义(并且按照惯例名称使用UPPER_CASE_AND_UNDERSCORES)

其他提示

<强>之所以受到final

如果它们没有被定义为最终的任何实施方式可以改变字段的值。然后,他们将成为实施的一部分。一个接口是一个没有任何实施纯规范。

<强>之所以受到static

如果它们是静态的,则它们属于接口,而不是对象,也不是对象的运行时类型。

有掩盖了这里几个百分点的:

仅仅因为在接口字段是隐式静态最终并不意味着他们必须是编译时间常数,甚至是不可改变的。可以定义e.g。

interface I {
  String TOKEN = SomeOtherClass.heavyComputation();
  JButton BAD_IDEA = new JButton("hello");
}

(要注意的是这样的注释定义内可以混淆的javac 时,与于上述实际上编译到一个静态初始化的事实。)

此外,这种限制的原因是比技术更文体,很多人会的看到它放松

的字段必须是静态的,因为它们不能是抽象的(类似的方法也可以)。因为它们不能是抽象的,实施者将不能在逻辑上提供不同的实现中的字段。

在字段必须是最后,我想,因为字段可以由许多不同的实施者访问允许它们以可改变的可能是有问题的(如同步)。也避免它被重新实现(隐藏)。

只是我的想法。

我认为字段中最终为不必要的限制和Java语言设计了一个错误的要求。有时间,例如树处理,当你需要在需要的接口类型的对象上执行操作的实现设置常量。在实现类选择代码路径是杂牌。我使用的解决方法是定义一个接口功能并通过返回实现它字面:

public interface iMine {
    String __ImplementationConstant();
    ...
}

public class AClass implements iMine {
    public String __ImplementationConstant(){
        return "AClass value for the Implementation Constant";
    }
    ...
}

public class BClass implements iMine {
    public String __ImplementationConstant(){
        return "BClass value for the Implementation Constant";
    }
    ...
}

然而,这将是更简单的,更清晰和更不易于异常实施使用以下语法:

public interface iMine {
    String __ImplementationConstant;
    ...
}

public class AClass implements iMine {
    public static String __ImplementationConstant =
        "AClass value for the Implementation Constant";
    ...
}

public class BClass implements iMine {
    public static String __ImplementationConstant =
        "BClass value for the Implementation Constant";
    ...
}

说明书、合同...机床指令为外地访问使用对象的地址加上领域抵消。由于类可以实现的许多接口,有没有办法使非最终接口领域有相同的偏移所有课程,扩大这种接口。因此,不同的机制用于现场准入必须实现:两个存储在访问(获得领域抵消,那场价值),而不是一个再加上维持一种虚拟现场表(模拟方法表)。猜猜他们只是不想要的复杂化jvm功能,可以很容易模拟通过现有的东西(方法)。

在卡拉我们可以有领域中的接口,虽然国内它们是实现我上面所解释的(如方法)。

<强> static

任何(变量或方法),其是在static Java可以援引为Classname.variablenameClassname.methodname或直接。这不是强制性的只能通过使用对象名来调用它。

在接口,对象不能声明和static使得有可能只是通过类名调用变量而不需要对象的名字。

<强> final

它有助于保持用于可变的恒定值,因为它不能在它的子类覆盖。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top