我的课程中有一个枚举的课程,其中包含该对象的列表
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;
答案 0 :(得分:3)
现在,如果我使用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>>
,事情会有相同的效果。)
答案 1 :(得分:2)
您的代码不会更改对象字段中所有SameObject的状态。
但是你可以通过将State枚举包装在另一个对象中来实现:
public enum State
{
ACTIVE, NOT_ACTIVE;
}
public class CurrentState
{
private State state;
public State getState()
{
return state;
}
public void setState(State state)
{
this.state = state;
}
}
public class SomeObject {
private CurrentState state;
public SomeObject(CurrentState state) {
this.state = state;
}
}
public class SomeObjects{
CurrentState state;
ArrayList<SomeObject> objects = new ArrayList<SomeObject>();
public SomeObjects(int count) {
state = new CurrentState();
state.setState(State.ACTIVE);
for (int i = 0; i < count; i++) {
objects.add(new SomeObject(state));
}
}
public void changeState(State state) {
this.state.setState(state);
}
}
答案 2 :(得分:1)
要更改所有对象中的状态,您需要明确更改每个对象中的状态:
public enum State {
ACTIVE,NOT_ACTIVE;
}
public class SomeObject {
State state;
public SomeObject(State state) {
this.state = state;
}
public void changeState(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) {
for (int i = 0; i < objects.size(); i++) {
objects.get(i).changeState(state);
}
}
}
您可以在数组列表中保存枚举类型,而不是为枚举创建包装类:
public enum State {
ACTIVE,NOT_ACTIVE;
}
public class SomeObjects{
State state;
ArrayList<State> objects = new ArrayList<State>();
public SomeObjects(int count) {
state = State.ACTIVE;
for (int i = 0; i < count; i++) {
objects.add(state);
}
}
public void changeState(State state) {
for (int i = 0; i < objects.size(); i++) {
objects.set(i, state);
}
this.state = state;
}
}
答案 3 :(得分:0)
这将是SomeObjects类的一种方法,可以在已定义的arraylist中更改对象的所有状态。 (请使用类似的类似名称......非常令人困惑!)
public void changeAllStates(State changingState) {
for (SomeObject yourObject : this.objects) {
yourObject.state = changingState;
}
}
SomeObjects类的changeState方法只会将SomeObjects.state变量引用到SomeObjects.objects.state变量。 (没有使用任何约定来展示层次结构......接受!)
答案 4 :(得分:0)
只需快速浏览一下,我认为它不会改变state
类中的类变量SomeObjects
以外的任何内容。我不是
如果您想更改所有对象的状态,我认为您必须再次浏览列表。添加一个方法来设置SomeObject
- 类中的状态,然后执行以下操作:
private void changeState(State givenState) {
for(SomeObject o: objects)
{
o.SetState(givenState);
}
}