使用enum作为java中的类

时间:2012-07-30 11:03:02

标签: java

我的课程中有一个枚举的课程,其中包含该对象的列表

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;

5 个答案:

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

(这里的枚举仍然没有什么特别之处;如果您要返回intStringMap<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);
    }
}