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

そして今、私がそれを使用すると、 SomeObjectsとリスト内のすべてのオブジェクトのchangeState(State.NOT_ACTIVE)状態が変更されますか、それともSomeObjectsのみで変更されますか?

SomeObjectsのみの場合、リスト内のすべてのオブジェクトの状態を変更するにはどうすればよいchangeState()ですか?

この場合、その列挙型を含むクラスを作成することが唯一の方法ですか?

更新:ありがとう、しかし私の場合、私はすべてのオブジェクトの状態を変更する必要があります

this.state = state;
4

5 に答える 5

3

そして今、changeState(State.NOT_ACTIVE)を使用すると、SomeObjectsとリスト内のすべてのObjectsで、または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に常に1つの親インスタンスを定義する必要があります)。上記のコードは、その設計をほぼ正確に表しています。

(そして、列挙型についてはまだ特別なことは何もありません。戻ってきた場合でも、またはintの場合でも、同じように機能します。)StringMap<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);
            }
        }

    }

enumのラッパークラスを作成する代わりに、配列リストにenum型を保持できます。

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クラスが、定義されたarraylist内のオブジェクトのすべての状態を変更するためのメソッドになります。(それほど類似していないクラス名を使用してください...かなり混乱します!)

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 に答える