Java接口中stateMachine变量为何默认被声明为final?
为什么Java接口中的stateMachine变量默认是final的?
在Java里,接口中声明的成员变量有个硬性语法规则——不管你有没有显式写修饰符,编译器都会自动给它加上public static final。这么设计是为了保证接口里的变量只能是全局常量,不允许被修改。
看你贴的代码,MessageType接口里的StateMachine stateMachine = null;,实际等价于:
public static final StateMachine stateMachine = null;
所以你在HeartBeat类的SetState方法里试图给stateMachine赋值,必然会编译报错——final变量一旦完成初始化,就不能再被重新赋值。
如果你的需求是让每个实现MessageType的类都拥有自己的stateMachine实例,正确的做法是把这个变量从接口移到实现类中,比如:
public class HeartBeat implements MessageType { private StateMachine stateMachine; // 每个实例独立维护的状态机 @Override public boolean process(String message) { return false; } @Override public StateMachine GetState() { return stateMachine; } @Override public void SetState(StateMachine stateIn) { stateMachine = stateIn; } }
这样每个HeartBeat对象都能自主管理自己的stateMachine状态,也符合面向对象的封装原则。
内容的提问来源于stack exchange,提问作者Ageis
相关产品推荐
相关产品推荐

