- PR -

setメソッドとaddメソッド

1
投稿者投稿内容
未記入
会議室デビュー日: 2005/08/06
投稿数: 4
投稿日時: 2005-08-13 20:29
あるクラスの中でプロパティーをListで定義し、このリスト変数の値をセットするにはsetXXXという方法がありますが、呼び出し側で繰り返してaddメソッドを使って値をセットしてもいいですが、どっちがいいですか、よくわかりません。アドバイスをください。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-08-13 20:50
それだけでは何がしたいのか伝わらないので、
どちらがいいかなんてアドバイスできませんよ。

もう少し質問内容を整理されてみてはいかがでしょうか。

add()メソッドはどのクラスのメソッドですか?
java.util.List#add(Object)のことですか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-08-13 20:54
値の追加をしたいときはaddを使いましょう。
setはそこに値が存在しない場合に、配列の境界エラーが発生することがあります。
値の入れ替えを行いたいときにsetを利用しましょう。
未記入
会議室デビュー日: 2005/08/06
投稿数: 4
投稿日時: 2005-08-14 12:58
質問を整理します。
class A{
List _aList = new ArrayList();

public void setAList(List list){
_aList = list
}

public add(String str){
_aList.add(str);
}
}

mainでList bを生成して、クラスAのの中にsetAListメソッドを使って、_aListに値をセットできるし。また、ループしてクラスAのaddメソッドを使って_aListをセットしてもいいです。どっちでもいいですが、よいやり方のどっちですかの問題です。
つまり、プロパティーにアクセスするにはget、setメソッドでいいですか、機能名のメソッドでいいですか?
ina
ベテラン
会議室デビュー日: 2005/04/14
投稿数: 58
投稿日時: 2005-08-14 13:33
クラスA中の_alistの要素の型をどこで保証するか?
と言う問題だと思います。
クラスAで保証させたいのであれば、
_alistそのものへのアクセッサ※1は作成しないで、
_alistの要素へのアクセッサ※2を作成するべきだと思います。

※1 List getAList(), void setAList(List list)
※2 void add(String str), String get(int index)など

ただしJDK5なら_aListの型を List<String>と宣言すれば、要素の型を保証できるようになるはずですので、aListそのものへのアクセッサだけで十分だと思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-08-14 16:47
クラス内部での整合性をどこまで保証したいか、で判断すべきでしょう。

inaさんがおっしゃるように、要素の型というのも整合性のひとつです。

List<String>を使ったとしても、リストに追加できる値かどうかの判定は、
Stringにキャストできるかだけでの判断になってしまいます。
追加や削除を全て包んでいれば、将来的な仕様変更により内容を制限したく
なったとしても、影響範囲はそのクラス自身だけで済むはずです。

これは、アクセッサメソッドがboolean add(String)でfalseを返したり、
IllegalArgumentExceptionを投げる等の仕様になっているかという話です。

公開されるAPIの多くでは、内部の実装にリストを使っていたとしても、
整合性の保証を優先してそのまま外部に渡さない仕様にすることが多いです。
例えばjava.util.Collections#unmodifiableList(List)で修飾したIteratorを
返したり、clone()したりtoArray()して複製したオブジェクトを返すとかです。

こういったことを踏まえて、リストを自身で完全に保護するか、
使う側の善意に委ねるかトレードオフする必要があるのではないでしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)