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

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实例)。上面的代码几乎是该设计的准确表示。

(并且这里的枚举仍然没有什么特别的;如果您返回intStringMap<MyFoo, Set<Future<ResultSet>>,事情将同样起作用。)

关于java - 在Java中将枚举用作类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11720166/

10-10 02:20