0

アプリケーションの残りの部分との同期を維持する必要がある一連の制御データを含むシングルトン クラスがあります。その結果、別のクラスで情報を読み取れるようにしたいが、変更はできないようにしたいことがよくあります。現在、このシングルトン クラスには多くのパブリック変数があります。ゲッター関数とセッター関数は冗長で煩わしいため、使用したくありません。また、変数はたくさんあります。

私のシングルトン クラスが ControlData と呼ばれる場合、ImmutableControlData と呼ばれる 2 番目のクラスを作成できます。このクラスにはすべて同じメンバーが含まれますが、それらは final と宣言されます。次に、シングルトンを取得するときに、ControlData オブジェクトではなく、ImmutableControlData を返します。ただし、これは、ImmutableControlData クラスと ControlData クラスを常に維持する必要があることを意味します (面倒です...)。

const-pointers があれば、const-pointer を ControlData オブジェクトに返すだけです。代わりに、Java で何ができますか?

4

3 に答える 3

3

Java には、C++ のような const の正確性がありません。

データを読み取るメソッドを宣言するインターフェイスを作成できますが、データを変更するメソッドは作成できません。データを保持するクラスにこのインターフェイスを実装させます。データを読み取るだけのプログラム内の他の場所にあるメソッドは、クラスではなくインターフェイスをパラメーターの型として受け入れる必要があります。例えば:

public interface ReadablePerson {
    String getName();
}

public class Person implements ReadablePerson {
    private String name;

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// Elsewhere...
public void someMethod(ReadablePerson p) {
    System.out.println(p.getName());
}

もちろん、 にキャストすることでsomeMethodこれを覆すこともできますが、少なくとも意識的な努力 (キャストを追加する) が必要です。これにより、プログラマーがすべきでないことを行っていることをプログラマーに警告する必要があります。pPerson

このソリューションの利点は、データの防御コピーを作成する必要がないことです。

于 2013-01-18T15:52:52.280 に答える
0

最初に: クラスに非常に多くのメンバーがいる場合は、クラスを小さなメンバーに分割してみてください。たぶん、いくつかの変数を要約することができます。

ControlflowVariables StateVariables

変数へのアクセスを制限したい場合は、getter を使用する必要があります。IDE はゲッターとセッターを作成できます。変数へのアクセスは同じです。

singletonClass.variableそれなら最悪ではないsingletonClass.getVariable()

コードのいくつかのポイントでのみアクセスを制限する場合は、変数の最終コピーを作成します

final int variable = singletonClass.getInstance().variable;
于 2013-01-18T15:55:20.677 に答える
0

個人的には、この方法でアクセスを制御しようとはしません。悪いプログラマーがクラスを悪用するのを防ぐためにできることは何もありません。C++ であっても、単純なconst_cast方法で「保護」を削除し、好きなようにシングルトンを変更できます。

代わりに、コードを再構築して、他の人が正しいことを簡単に実行できるようにし、他の人が間違いを犯しにくいようにします。ControlData のインターフェイスを 2 つの別個のインターフェイスに分離します。1 つはオブジェクトの読み取り用で、もう 1 つはオブジェクトの更新用です。次に、必要な場所に 2 つのインターフェイスを提供するだけです。

于 2013-01-18T15:55:35.557 に答える