【发布时间】:2013-01-01 05:45:15
【问题描述】:
我有一个抽象类:
public abstract class AbstractCommand {
private static State state;
}
意图
-
State类的对象由一些“控制类”提供,提供每个AbstractCommand子类所需的数据 - 每个子类都需要对其进行读取访问
- 子类不允许更改字段
目前的做法
字段state 应该由程序的“控制类”初始化,以便子类(定义命令)可以使用它(只读)。子类是内部定义的,应该用作用户的接口。此用户不应拥有对 state 的写入权限。
问题
- 在
AbstractCommand中添加公共setState()方法将使其可供所有子类以及用户访问 - 将字段设为 final 将强制在抽象类中创建对象,“控制类”必须使用该对象,而且它不可替换
你如何处理这样的事情?
再试一次
因为一些答案建议使用包可见性的解决方案,我想知道这是否会做得很好:
通过将来自“控制类”(来自包外部)的调用委托给抽象类,在同一个包中拥有一个提供所需信息的类。
听起来也有点模糊,但你怎么看?
【问题讨论】:
-
所以你希望 AbstractCommand 的子类不能设置状态值,但是其他类可以做到?
-
是的,类似的。当然,效果相同的更合适的解决方案也可以。
-
您希望
state变量在您的所有命令中“共享”吗?在我看来,您只想在扩展类之间共享状态(即,一个用于 Command1 的所有实例,一个用于 Command2 的所有实例,等等)。 -
是的,所有命令(是扩展类)都需要读取权限。它始终是同一个变量。
-
我明白了,但是在您的抽象类中将
state声明为static将导致 所有 扩展类共享 相同状态。因此,如果Command1的实例与Command2的实例具有相同的状态。只要确保我理解你想要什么。
标签: java visibility encapsulation software-design