- PR -

JAVAにおけるstaticメソッド

投稿者投稿内容
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-05-08 14:35
>これも一つの方法ですが、適切なモデリングとは思えません。
「適切なモデリング」ねえ....
何を持って「適切」という単語を使っているのやら.

>AListのようなクラスを定義して
>class AList extends ArrayList {
>...
ここで実装の継承を使うことは,クラス間の依存性を増やすだけで
メリットはまずないと考えます.

そもそも「モデル化」と「実装の継承」と,一体なんの関係があるのやら.
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-05-08 14:36
引用:

class AList extends ArrayList {
...
public int getSum() {
int sum = 0;
for (Iterator it = iterator(); it.hasNext(); ) {
A a = (A) it.next();
sum += a.get();
}
return sum;
}
...
}


こういう、特定のCollection実装を継承して機能を追加するのは、
小回りがきかず、うまくいかなくなることの方が多いです。

Aというクラスがあるとき、A(もしくはそのサブクラス)のインスタンスを
格納するCollectionに対する操作は、基本的にstaticメソッドとして
私は実装するようにしています。
コード:

public class AUtils {
/** インスタンス化は禁止。staticメソッドのみを提供する。 */
private AUtils() {}

public static int getSum(Collection c) {
int sum = 0;
for (Iterator it = c.iterator(); it.hasNext(); ) {
A a = (A) it.next();
sum += a.get();
}
return sum;
}
}


こうしておくと、
コード:

List unmodifiable_list = Collections.unmodifiableList(a_list);
...
int sum = AUtils.getSum(unmodifiable_list);


とか、
コード:

// a_listを昇順にソートし、はじめの10個の合計を求める。
Collections.sort(a_list);
int sum = AUtils.getSum(a_list.subList(0, 10));


とか、
コード:

Map a_map = new HashMap();
a_map.put("yamasa", new A(10));
...
int sum = AUtils.getSum(a_map.values());


のように、コレクションフレームワークを最大限に活用することができます。

ArrayListを継承するやり方だと、ここまでの柔軟性は得られません。

[ メッセージ編集済み 編集者: yamasa 編集日時 2003-05-09 00:23 ]
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-08 15:35
どうして理解してくれないのか・・・

継承自体に意味はありません。
あくまで実装例でしょ。

そういう機能を追加したいのであれば、
コード:

public class AList {
private List innerList;
public AList() {
innerList = (リストの初期化);
}

private AList(List alist) {
innerList = alist;
}

public int getSum() {
int sum = 0;
for (Iterator it = innerList.iterator(); it.hasNext(); ) {
A a = (A) it.next();
sum += a.get();
}
return sum;
}

public int sortAndAreaSum(int start, int end) {
List distList = innerList.clone();
distList.sort();
AList workList = new AList(distList.subList(start, end));
return workList.getSum();
}

}


例外処理はおいといて・・こういう実装とHashMapを拡張したAMapを別に作るべきでしょう。

#Collection.copyはマズイので修正


[ メッセージ編集済み 編集者: zaxx_MD 編集日時 2003-05-08 16:46 ]
yamasa
ベテラン
会議室デビュー日: 2003/02/15
投稿数: 80
投稿日時: 2003-05-08 16:27
引用:

どうして理解してくれないのか・・・


それは、貴方の意見の中に、その根拠についての記述がないからです。
「〜だと思います」「〜すべきです」と言うだけで、何故そう考えたのか
という根拠が示されていなければ、その発言に説得力はありません。

私は、getSum()のようなメソッドはstaticにすべきだということを述べるにあたり、
その根拠としてコレクションフレームワークとの親和性の高さを
実例を挙げながら説明しました。

貴方がArrayListやHashMapを拡張する実装のほうが良いと考える理由はなんですか?
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-08 16:55
たしかにコードを交えながら説明していませんが、
元もとの意図は2レス目から書いていますので、
あえて再度同じ文章を書くことはしていません。

コレクションフレームワークと親和性が高いとは何を指していますか?
それこそ根拠の無い言い訳だと思います。
どちらの実装が優れているかという問題はstaticであるべきかどうかとは別問題です。

Aというクラスに対してモデリングをする努力を放棄していませんか?
AのリストであるというモデリングをされたAListという実装をする努力を放棄していませんか?
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 2003-05-08 17:53
いやー、皆さんお熱い意見ありがとうございます(笑)

えっと、何回かこのスレッドを読み直しているのですが、最初に知りたかったことがいまいちはっきりしないので(私の理解力が無いせいかもしれませんが。あ、最初の質問の仕方が悪かったかな?)質問し直させていただきます。

アプリケーションの規模や、他のクラスとの関わり、etcなど条件はいろいろあるのでしょうが、staticメソッドを作成する再にそのメソッドをstaticにした境界線みたいなものってなんでしょうか?
この質問も「これが正解!!」というものは無いかと思いますが、皆さんの意見をお聞かせ願えませんか?

余談ですが、なぜこのような質問をするかといいますと、もともと私はVBオンリーの開発者でしたのでコーディングを行う際には手続き型チックなソースが浮かびやすいのです(ただいま、一生懸命オブジェクト指向的な考えに修正中です)。
VBをやっていた方にはわかっていただけると思いますが、私のように手続き型にかたよった人間がオブジェクト指向言語に入ると、staticメソッドがとても便利な物に見えてしまいます。
staticメソッドは極力使用しないほうがいいということは「わかって」はいますが「理解」はしてい無いように思います。
最初のほうにご指摘があったように「クラス変数とインスタンス変数とメソッド変数の挙動」について学習はしますが、皆さんの経験(あ、もちろん裏づけのある)からくる意見をお聞かせいただけると幸いです。
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-05-08 18:43
>元もとの意図は2レス目から書いていますので、
>あえて再度同じ文章を書くことはしていません。
あいも変わらず「適切なモデリング」「モデリングが崩れるから良くない」etc.
つまり根拠は「モデリング」ということですかね.

一体どんな勉強をしたのか知りたいものです.
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-05-08 18:54
>VBをやっていた方にはわかっていただけると思いますが、私のように手続き型に
>かたよった人間がオブジェクト指向言語に入ると、staticメソッドがとても便利な
>物に見えてしまいます。
私もN88-Basic,Cを経てJavaに来てますからその辺は分からなくもないですよ.

多分,問題なのはstaticメソッドかnon-staticメソッドかではなく,
「より適切なOOPらしい,良い設計はどんなものか」
だと思います.
#決してモデリングじゃありません.

設計さえ決まれば,どの部分がインスタンスになり,どの部分が
インスタンスメソッドになり,どの部分がstaticメソッドになるか,概ね決まって
きます.最後までどちらにするか悩む部分もありますが,こういう部分はどちらで
実装しても構わない場合が多かったりします.

で,どうすれば良い設計ができるかですが,これについては一言では
説明できません.(それができるなら,私はOOPの講習会を開いて大金持ちに
なれるでしょう.(^^) )GoFのデザインパターンとかリファクタリングとか
そう言った良書でも読みながら,少しずつ真似をして理解を深めていく
他ないと思います.

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