我有一个带有枚举的类和一个类,其中包含该对象的列表
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 以及列表中的所有对象中的状态还是只更改SomeObjects中的状态?如果仅在 SomeObjects 中,我该怎么做才能用
changeState()
更改列表中所有对象中的状态?在这种情况下,是否创建包含该枚举的类仅是?
更新:,谢谢,但是我需要更改所有对象的状态
this.state = state;
最佳答案
现在,如果我使用changeState(State.NOT_ACTIVE),它将更改SomeObjects和列表中所有对象的状态,还是仅更改SomeObjects中的状态?
我不确定您的想法是什么。
如果您在changeState(NOT_ACTIVE)
的某些实例上调用SomeObjects
,则根据方法的定义,它将将该对象的state
字段设置为NOT_ACTIVE
。这个单一方法调用不可能更改多个对象,因为它对单个变量执行单个分配。
如果仅在SomeObjects中,该如何使用changeState()更改列表中所有对象的状态?
如果希望changeState
方法将状态应用于objects
字段中包含的所有对象,则可以通过一个简单的循环使其执行此操作:
public void changeState(State state) {
this.state = state;
for (SomeObject obj : objects) {
obj.state = state;
}
}
在这种情况下,创建包含该枚举的类是唯一的方法吗?
同样,我不清楚您在想什么。您是否不想设置
state
实例中包含的所有SomeObject
实例的SomeObjects
值?也就是说,在已经定义的类的现有实例上设置值吗?如果是这样,则可以通过在循环中设置这些值来完成上述操作。字段是枚举这一事实没有任何区别;任何原始或引用类型在这里的行为都相同。
编辑回答评论:啊,听起来根本问题是首先使用字段。
假设您希望
objects
集合的所有内容始终处于完全相同的状态,那么它们全部具有单独的state
字段可能是错误的。这是一个建模错误,因为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/