java接口中定义成员变量后会被不同实现类修改,别忘记接口变量默认是public static final
原创 2021-11-18 16:43 阅读(2348)次
今天定义了一个接口,它有很多实现类,为了把实现类中的相同的变量抽出去,于是我把它放在了接口类中。
代码如下:
接口代码:
public interface ValueHandle {
public Map<String, String> generateModeSupportMap = new HashMap<>();
}
实现类代码:
public class DateValueHandle implements ValueHandle {
@Override
public void afterPropertiesSet() throws Exception {
generateModeSupportMap.put(GenerateMode.fixed.name(), "");
generateModeSupportMap.put(GenerateMode.random.name(), "");
// more operators
}
}
另一个实现类代码:
public class NumberValueHandle implements ValueHandle {
@Override
public void afterPropertiesSet() throws Exception {
generateModeSupportMap.put(GenerateMode.fixed.name(), "");
generateModeSupportMap.put(GenerateMode.random.name(), "");
generateModeSupportMap.put(GenerateMode.ratio.name(), "");
generateModeSupportMap.put(GenerateMode.express.name(), "");
generateModeSupportMap.put(GenerateMode.dict.name(), "");
// more operators
}
}
以上实现类都是在设置各自的generateModeSupportMap,但发现运行过程中所有实现类的generateModeSupportMap都包含了其他实现的所有数据。也就是说generateModeSupportMap可能是共享的,于是查了下接口变量的特性:接口可以理解成统一的”协议”,而接口中的属性也属于协议中的内容;但是接口的属性都是公共的,静态的,最终的,成员变量 只能是常量。默认修饰符 public static final,即使不加上这些修饰符,接口里的变量也只能是public static final,所以这也解释了我犯的错。。