2011-12-03 21 views
4

クラスAのインスタンスには、プライベートArrayListがあります。インスタンスは、arrayListに格納されているデータを保持する役割を担います。他のモジュールがデータを要求したときに私のコードを安全にする方法は? - 非公開vs.公開

private ArrayList<SomeDataStructure> myPrivateArrayList; 

しかし、クラスAのインスタンスがそれを要求誰でもデータを渡す必要がありますので、公共の機能は、クラスAにあります:

public ArrayList<SomeDataStructure> getMyPrivateArrayList(); 

私の質問は、このpublic関数を介してarrayListを取得した人がそれを変更できないようにするためです(返り値は、読み取り専用)。

ありがとうございます!

+2

コピーを返しますか? 'Collections.unmodifiableList'を使用しますか? –

答えて

6

(あなたは自分の状況にまで許可されている場合)、私は代わりに、これを行うことを示唆している:公開されたデータ構造は型であることを

private ArrayList<SomeDataStructure> myPrivateArrayList; 

public List<SomeDataStructure> getMyPrivateList() { 
    return Collections.unmodifiableList(myPrivateArrayList) 
} 

注意ArrayListの代わりにListです。私は(一般的に言って)クラスのパブリックインターフェイスは具体的な型を返すべきではなく、むしろインターフェイスを返すべきだと思います。これは、このようなタスクを単純化し、あるクラスが別のクラスの実装に依存する量を減らします。あなたのgetMyPrivateArrayList()機能で

0

返品タイプArrayList<SomeDataStructure>の代わりにList<SomeDataStructure>を使用してください。次に、あなたのリストの読み取り専用のビューを作成するthe java.util.Collections.unmodifiableList(...) utility-methodを使用することができます。

public List<SomeDataStructure> getMyPrivateArrayList() 
{ 
    return Collections.unmodifiableList(myPrivateArrayList); 
} 

別のオプションは、あなたのリストのコピーを返すことです:

public ArrayList<SomeDataStructure> getMyPrivateArrayList() 
{ 
    return new ArrayList<SomeDataStructure>(myPrivateArrayList); 
} 

(他のいくつかのオプションは、同様にあります。しかし、最も一般的なアプローチです)

SomeDataStructureが変更可能な場合、上記のいずれかの呼び出し元は、依然としてリスト内のオブジェクトを変更することができます。 (すなわち、それらはobj.getMyPrivateArrayList().get(0).setProp(null)ような何かを行うことができ、ある。)

0

は、次の手順を実行します

public List<SomeDataStructure> getMyPrivateArrayList(){ 
    return Collections.unmodifiableList(myPrivateArrayList); 
} 

Collections.unmodifiableList(someList)返す読み取り専用リスト。


返されたリストを変更しようとすると、呼び出し側のクラスでエラーが発生します。例えば、 。

そうした場合、あなたはエラー以下を得るよ次

List<SomeDataStructure> readOnlyList=getMyPrivateArrayList(); 
readOnlyList.add(new SomeDataStructure()); 

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.Collections$UnmodifiableList.add(Collections.java:1160) 
    at MainClass.main(MainClass.java:14) 
+1

'Collections.unmodifiableList'は読み取り専用' List'を返します。したがって、 'getMyPrivateArrayList'の戻り値の型は、少なくとも' ArrayList'でなく 'ArrayList'でなければなりません。 –

+0

@KenWayneVanderLindeいいキャッチ.. – gtiwari333

0

あなたがリストを取得する必要がありますか?または、アクセサーをリストに転送するだけでもいいですか? get(index)のようないくつかのパブリック関数を定義すれば、リストの同等のメソッドを呼び出して結果を返すことができます。これは、あなたが選択したメソッドにのみアクセスできるため、ユーザーはリスト自体を提供したり、データを "読み取り専用"構造にコピーするCPUの浪費を浪費したりする必要がないため、やりたいことです。

関連する問題