Answers:
接口不能具有行为或状态,因为它仅用于指定交互协定,而不能指定实现细节。通过不允许方法/构造函数主体或静态/实例初始化块来强制执行“无行为”。仅允许静态最终字段强制实施“无状态”。因此,该类可以具有状态(静态),但是实例状态不能由接口推断出来。
顺便说一句:Java中的常量由静态的final字段定义(按照惯例,名称使用UPPER_CASE_AND_UNDERSCORES)。
static final
,而不是承认它们失败,而是将实例字段强制为,这与const
在Java中获得的逼近(真实C / C ++)一样。不幸的是,这是隐式的,并且可能导致非专家的困惑。(我只是意识到,这是static
因为我观察到了意外的行为。我了解到,它们final
仅来自此答案。)
存在的原因 final
如果未将其定义为final,则任何实现都可以更改字段的值。然后它们将成为实现的一部分。接口是纯规范,没有任何实现。
存在的原因 static
如果它们是静态的,则它们属于接口,而不是对象,也不属于对象的运行时类型。
这些字段必须是静态的,因为它们不能是抽象的(就像方法可以那样)。因为它们不能是抽象的,所以实现者将无法在逻辑上提供字段的不同实现。
我认为这些字段必须是最终字段,因为许多不同的实现者都可以访问这些字段,从而使它们可以更改可能会出现问题(因为同步)。还要避免它被重新实现(隐藏)。
只是我的想法。
public static
字段不是final
,则findbugs会抱怨(正确!)。
我认为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";
...
}