我有一个包含enum 的类,其中包含list 对象
public enum State {
ACTIVE,NOT_ACTIVE;
}
public class SomeObject {
State state;
public SomeObject(State state) {
this.state = state;
}
}
public class SomeObjects{
State state;
ArrayList<SomeObject> objects = new ArrayList<Main.SomeObject>();
public SomeObjects(int count) {
state = State.ACTIVE;
for (int i = 0; i < count; i++) {
objects.add(new SomeObject(state));
}
}
public void changeState(State state) {
this.state = state;
}
}
现在,如果我使用 changeState(State.NOT_ACTIVE)
,它会改变 SomeObjects 和 list 中的所有对象的状态,或者只改变一些对象?
如果仅在 SomeObjects 中,我应该如何使用 changeState()
来更改列表中所有对象的状态?
在这种情况下,创建包含该枚举的类是唯一的方法吗?
更新:谢谢,但就我而言,我需要使用
更改所有对象的状态this.state = state;
最佳答案
And now if I use changeState(State.NOT_ACTIVE) it will change state in SomeObjects and in all Objects in list or only in SomeObjects?
我不完全确定你的思路是什么。
如果您调用 changeState(NOT_ACTIVE)
在 SomeObjects
的某些实例上, 然后根据方法的定义,它将设置该对象的 state
字段为 NOT_ACTIVE
.这个单个方法调用不可能更改多个对象,因为它对单个变量执行单个赋值。
If only in SomeObjects, what should I do to change state in all Objects in list with changeState()?
如果你想要 changeState
将状态应用于 objects
中包含的所有对象的方法场,那么你可以用一个简单的循环让它做到这一点:
public void changeState(State state) {
this.state = state;
for (SomeObject obj : objects) {
obj.state = state;
}
}
Is the creating of class, containing that enum, the only way in this case?
同样,我不清楚您在这里的确切想法。你不想设置state
吗?所有 SomeObject
的值(value)SomeObjects
中包含的实例实例?也就是说,为已经定义的类的已经存在的实例设置值?
如果是这样,那么这可以通过在循环中设置值来完成。该字段是一个枚举这一事实没有区别;任何原始类型或引用类型在这里的行为都是相同的。
编辑以回答评论:啊,听起来根本问题首先是使用字段。
鉴于您想要 objects
的所有内容集合始终具有完全相同的状态,它们都有一个单独的 state
可能是错误的 field 。这是一个建模错误,因为 SomeObject
实例并不真正独立地持有/控制它自己的状态。
我之前要建议的是,您应该实现方法,而不是直接访问字段 - 这就是现在出现的问题。而不是 SomeObject
有一个state
字段,它应该有一个 getState()
方法。对于给定的实例,您有办法获取其当前状态 - 但这不一定作为直接对象引用来实现。
这个方法的实现应该只是获取包装的状态 SomeObjects
实例(这不是一个特别有用的类名)。所以它可能实现如下:
public class SomeObject {
private final SomeObjects parent;
public SomeObject(SomeObjects parent) {
this.parent = parent;
}
public State getState() {
return parent.state; // Ideally accessed via method too
}
}
这与我对您的设计的理解是一致的 - 每个 SomeObject
与包装状态相同 SomeObjects
(因此隐含地必须始终定义一个父 SomeObjects
实例)。上面的代码几乎是该设计的精确表示。
(枚举在这里仍然没有什么特别之处;如果您返回 int
或 String
或 Map<MyFoo, Set<Future<ResultSet>>
,事情将以相同的方式工作。)
关于java - 在 Java 中使用枚举作为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720166/