3

我有一个包含枚举的类和包含该对象列表的类

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;
4

5 回答 5

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的所有实例的值吗?也就是说,为已经定义的类的已经存在的实例设置值?SomeObjectSomeObjects

如果是这样,那么这可以通过在循环中设置值来完成。该字段是枚举的事实没有区别;任何原始类型或引用类型在此处的行为都相同。


编辑回答评论:啊,听起来根本问题首先是使用一个字段。

鉴于您希望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始终定义一个父实例)。上面的代码几乎是该设计的精确表示。

(而且这里的枚举仍然没有什么特别之处;如果你返回intorString或,事情的工作原理是一样的Map<MyFoo, Set<Future<ResultSet>>。)

于 2012-07-30T11:12:24.350 回答
2

您的代码不会更改对象字段中所有 SameObjects 的状态。

但是您可以通过将 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);
    }
}
于 2012-07-30T11:13:24.523 回答
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;
            }

        }
于 2012-07-30T11:21:42.167 回答
0

这将是您的 SomeObjects 类的一种方法,用于更改定义的数组列表中对象的所有状态。(请使用不那么相似的类名......非常令人困惑!)

public void changeAllStates(State changingState) {
    for (SomeObject yourObject : this.objects) {
         yourObject.state = changingState;
    }
}

SomeObjects 类的 changeState 方法只会引用您的 SomeObjects.state-variable,而不是 SomeObjects.objects.state-variable。(没有使用任何约定来显示该层次结构..对不起!)

于 2012-07-30T11:08:38.587 回答
0

只看了一眼,我认为它不会改变类state中的类变量以外的任何东西SomeObjects。我不是

如果要更改所有对象的状态,我认为您必须再次遍历列表。在 -class 中添加一个设置状态的方法SomeObject,然后执行以下操作:

private void changeState(State givenState) {
    for(SomeObject o: objects)
    {
        o.SetState(givenState);
    }
}
于 2012-07-30T11:20:02.840 回答