- PR -

JAVAにおけるstaticメソッド

投稿者投稿内容
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 2003-05-12 17:37
こんにちは、北斗のポンです。

皆さんの貴重なアドバイス毎回毎回感謝をしながら読ませていただいています。
皆さんのおかげでこのスレッドを立てた当時に一番知りたかったことがだいぶまとまりつつあります。
ただ、やはり経験不足な私にとって、まだ消化しきれていない様子です(汗)


引用:

悪夢を統べるものさんの書き込み(2003-05-08 18:54)より;
GoFのデザインパターンとかリファクタリングとか
そう言った良書でも読みながら,少しずつ真似をして理解を深めていく
他ないと思います.


GoF本ってやつですか?一回見たことはあるのですが、当時の私は脳みそが完全に拒絶していたような(汗)

引用:

ほむらさんの書き込み(2003-05-09 12:20)より;
なにやら、モデリングについて新しいスレッドもほしくなる記事になりつつありますね。
モデリングとはなにか、とか(笑)


同感です(笑)

うのきちさんの書いてくださったソース・・・すみません、まだ理解してないです(涙)
せっかく書き込みしてくださっているので、文法的なところを学習しながらちゃんと理解します。

引用:

unibonさんの書き込み(2003-05-12 09:33)より;
すなわち、static にするかどうかが問題ではなく、
その前に、容易に static にできてしまうほど、カプセル化がされていないかどうかが問題です。


そうですね、カプセル化・・・勉強しなおそうかな?

引用:

zaxx_MDさんの書き込み(2003-05-12 16:52)より;
そして、staticで手続き処理の書き方をしてしまうと、
非常にモデリングしにくくなってしまう。


おそらく、私のソースに指摘してくださった人もこの辺の兼ね合いもあったのでしょうね。
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 2003-05-12 17:37


[ メッセージ編集済み 編集者: 北斗のポン 編集日時 2003-05-13 09:03 ]
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 2003-05-12 17:39
あ、エラーになったから送信しなおしたら2つ投稿してしてしまった。
しかも、長いメッセージ・・・すみませんです。
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-12 21:42
引用:

引用:
-------------------------------------------------------
ほむらさんの書き込み(2003-05-09 12:20)より;
なにやら、モデリングについて新しいスレッドもほしくなる記事になりつつありますね。
モデリングとはなにか、とか(笑)
-------------------------------------------------------
同感です(笑)


こちらを参照してはいかがでしょうか。
ただし、プログラムのレベルまでは落ちていませんので、
回答になってないかもしれませんが。
http://www.atmarkit.co.jp/fjava/devs/modeling01/modeling01.html

[ メッセージ編集済み 編集者: zaxx_MD 編集日時 2003-05-12 21:43 ]
北斗のポン
会議室デビュー日: 2003/05/02
投稿数: 17
投稿日時: 2003-05-13 10:59
こんにちは、北斗のポンです。

先日
「うのきちさんの書いてくださったソース・・・すみません、まだ理解してないです(涙)
せっかく書き込みしてくださっているので、文法的なところを学習しながらちゃんと理解します。」
と言う書き込みをしましたが、自分なりに考えた結果、一応理解したつもりですが間違っていたら指摘していただきたいと思い、投稿してみました。
ちょっと件名とは方向性がずれてしまいますが、ご教授いただければ幸いです。


引用:

うのきちさんの書き込み (2003-05-11 11:50) より:
コード:

List list = new ArrayList() {{
add(new A(1));
add(new A(2));
add(new A(3));
}};




この部分は、「こういう初期化の仕方もあるんだぁ」ってことで納得しましたが、いまいち「new ArrayList() {{ 」の二十括弧の仕組みがわかりませんでした。
この2重括弧を1重にするとコンパイルが通らないみたいなので、こういう文法もあるんだと勉強になりましたが、どういう仕組みか教えていただけると助かります。


引用:

うのきちさんの書き込み (2003-05-11 11:50) より:
コード:

int sum = new Accumlation(list, new Accumlation.Getter()
{
public int get(Object o) {
return ((A)o).get();
}
}).getSum();




この部分、最初はちんぷんかんぷんでした(汗)
えっと、自分なりに考えた結果
int sum = new Accumlation(list, new Accumlation.Getter()
と言うのは、Accumlationクラスのインナーinterfaceを実装した仮想的なクラスを定義してその仮想クラスにget()メソッドを実装していると考えていいのでしょうか?
最初一番わからなかったのが「new Accumlation.Getter()」がどこに new しているのかわからなくて、上記のように考えたらつじつまが合ったのですが、もし間違っているようでしたらご指摘してくださると助かります。

PS
私は、今までインナークラス等は、そのインナークラスを定義しているクラス内でのみ使用する方法しか知らなかったので、このソースはすごく興味が湧きました。


[ メッセージ編集済み 編集者: 北斗のポン 編集日時 2003-05-13 13:19 ]

[ メッセージ編集済み 編集者: 北斗のポン 編集日時 2003-05-13 13:23 ]
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-05-13 13:53
>ArrayList() {{ 」の二十括弧の仕組みがわかりませんでした。
引数なしコンストラクターの省略形・・のようなものです。

>仮想クラスにget()メソッドを実装していると考えていいのでしょうか?
そうですね。

どちらも一見高度そうに見えて、全く実用的ではありません。
メソッドの処理の中で書くと処理と定義が混在し、
非常に読み難いコードになります。
こういったコードを読めることは将来的にも+になるかもしれませんが、
これらの書き方に習う必要はないでしょう。

ただし、このように書き込むスペースが狭いBBSでは有効な手段かもしれません。
そういった制約のない場合はきちんとクラスファイルを定義したらいいでしょう。
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-05-13 22:08
引用:

List list = new ArrayList() {{
add(new A(1));
add(new A(2));
add(new A(3));
}};
この部分は、「こういう初期化の仕方もあるんだぁ」ってことで納得しましたが、いまいち「new ArrayList() {{ 」の二十括弧の仕組みがわかりませんでした。
この2重括弧を1重にするとコンパイルが通らないみたいなので、こういう文法もあるんだと勉強になりましたが、どういう仕組みか教えていただけると助かります。



new Class名() {}とか、new Interface名() {}という書き方は、多用されるので憶えておいた方がいいです。これはインナークラスの一種で無名クラスと呼ばれます。この例だと、ArrayListを継承したクラスを無名で定義し、そのクラスのインスタンスを生成することになります。で、内側の{}は、イニシャライザと呼ばれ、インスタンスが生成される時に、この中が実行されます。こちらはあんまり使われることはないので、憶えなくてもいいと思います ^^;。無名クラスはコンストラクタを持てないので、インスタンスの初期化は、イニシャライザを使うしかありません。別に二重の{というのに意味があるわけではないんです。応用で、ちょっとHashMapを作りたい場合は、こういうのも出来ます。JUnitで単体テストを書く時にテストデータを用意する場合なんかに便利ですね。

Map map = new HashMap() {{
put("A", "Apple");
put("B", "Book");
}};

引用:

int sum = new Accumlation(list, new Accumlation.Getter()
{
public int get(Object o) {
return ((A)o).get();
}
}).getSum();
この部分、最初はちんぷんかんぷんでした(汗)
えっと、自分なりに考えた結果
int sum = new Accumlation(list, new Accumlation.Getter()
と言うのは、Accumlationクラスのインナーinterfaceを実装した仮想的なクラスを定義してその仮想クラスにget()メソッドを実装していると考えていいのでしょうか?
最初一番わからなかったのが「new Accumlation.Getter()」がどこに new しているのかわからなくて、上記のように考えたらつじつまが合ったのですが、もし間違っているようでしたらご指摘してくださると助かります。



これもいっしょで、new Interface名(){}の応用で、Interfaceがたまたまインナーインターフェースなだけです。「仮想的なクラス」は、正確には「無名クラス」(Anonumous class)といいます。理解は合っています。

引用:

私は、今までインナークラス等は、そのインナークラスを定義しているクラス内でのみ使用する方法しか知らなかったので、このソースはすごく興味が湧きました。



そうですね。Javaでは色んな方法でクラス定義が出来ますから、最初は戸惑いますね。でも、この無名クラスは非常に有用で「一つのクラスを定義するまでもない、雑用クラス」を作る時には重宝します。特にアダプタクラス。ただ、これで大きなクラスを書くのは本末転倒なので、無名クラス、ローカルクラスにするのは、せいぜい10行程度に収まるクラスが対象です。
Kensaku
常連さん
会議室デビュー日: 2003/02/16
投稿数: 22
投稿日時: 2003-05-13 22:11
北斗のポンさんへ

インデントが崩れてしまったので、わかりづらいのかもしれません。
この様にするとわかりませんか?
コード:
List list = new ArrayList() { //匿名クラスの宣言
    { //インスタンス初期化子のオーバーライド
        add(new A(1));
        add(new A(2));
        add(new A(3));
    }
};


Getterはメンバーインターフェースです。
メンバーインターフェースは暗黙でstaticになるので、他のクラスから使うとき
『new Accumlation.Getter()』の様になります。
コード:
int sum = new Accumlation(list, new Accumlation.Getter() { //匿名クラスの宣言
    public int get(Object o) { //メソッドのオーバーライド
        return ((A)o).get();
    }
}).getSum(); //メソッドの呼び出し



うのきちさんへ

『BBコード』の『CODEタグ』を使うと、タグで囲んだ部分の文字を等幅のフォントで、インデント付きの状態で表示されます。


zaxx_MDさんへ

私はうのきちさんの書き方は無駄がなく良いと思います。
この様な書き方が広く普及して欲しいと思っています。

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