- - PR -
JAVAにおけるstaticメソッド
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-05-12 17:37
こんにちは、北斗のポンです。
皆さんの貴重なアドバイス毎回毎回感謝をしながら読ませていただいています。 皆さんのおかげでこのスレッドを立てた当時に一番知りたかったことがだいぶまとまりつつあります。 ただ、やはり経験不足な私にとって、まだ消化しきれていない様子です(汗)
GoF本ってやつですか?一回見たことはあるのですが、当時の私は脳みそが完全に拒絶していたような(汗)
同感です(笑) うのきちさんの書いてくださったソース・・・すみません、まだ理解してないです(涙) せっかく書き込みしてくださっているので、文法的なところを学習しながらちゃんと理解します。
そうですね、カプセル化・・・勉強しなおそうかな?
おそらく、私のソースに指摘してくださった人もこの辺の兼ね合いもあったのでしょうね。 | ||||||||||||||||
|
投稿日時: 2003-05-12 17:37
[ メッセージ編集済み 編集者: 北斗のポン 編集日時 2003-05-13 09:03 ] | ||||||||||||||||
|
投稿日時: 2003-05-12 17:39
あ、エラーになったから送信しなおしたら2つ投稿してしてしまった。
しかも、長いメッセージ・・・すみませんです。 | ||||||||||||||||
|
投稿日時: 2003-05-12 21:42
こちらを参照してはいかがでしょうか。 ただし、プログラムのレベルまでは落ちていませんので、 回答になってないかもしれませんが。 http://www.atmarkit.co.jp/fjava/devs/modeling01/modeling01.html [ メッセージ編集済み 編集者: zaxx_MD 編集日時 2003-05-12 21:43 ] | ||||||||||||||||
|
投稿日時: 2003-05-13 10:59
こんにちは、北斗のポンです。
先日 「うのきちさんの書いてくださったソース・・・すみません、まだ理解してないです(涙) せっかく書き込みしてくださっているので、文法的なところを学習しながらちゃんと理解します。」 と言う書き込みをしましたが、自分なりに考えた結果、一応理解したつもりですが間違っていたら指摘していただきたいと思い、投稿してみました。 ちょっと件名とは方向性がずれてしまいますが、ご教授いただければ幸いです。
この部分は、「こういう初期化の仕方もあるんだぁ」ってことで納得しましたが、いまいち「new ArrayList() {{ 」の二十括弧の仕組みがわかりませんでした。 この2重括弧を1重にするとコンパイルが通らないみたいなので、こういう文法もあるんだと勉強になりましたが、どういう仕組みか教えていただけると助かります。
この部分、最初はちんぷんかんぷんでした(汗) えっと、自分なりに考えた結果 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 ] | ||||||||||||||||
|
投稿日時: 2003-05-13 13:53
>ArrayList() {{ 」の二十括弧の仕組みがわかりませんでした。
引数なしコンストラクターの省略形・・のようなものです。 >仮想クラスにget()メソッドを実装していると考えていいのでしょうか? そうですね。 どちらも一見高度そうに見えて、全く実用的ではありません。 メソッドの処理の中で書くと処理と定義が混在し、 非常に読み難いコードになります。 こういったコードを読めることは将来的にも+になるかもしれませんが、 これらの書き方に習う必要はないでしょう。 ただし、このように書き込むスペースが狭いBBSでは有効な手段かもしれません。 そういった制約のない場合はきちんとクラスファイルを定義したらいいでしょう。 | ||||||||||||||||
|
投稿日時: 2003-05-13 22:08
new Class名() {}とか、new Interface名() {}という書き方は、多用されるので憶えておいた方がいいです。これはインナークラスの一種で無名クラスと呼ばれます。この例だと、ArrayListを継承したクラスを無名で定義し、そのクラスのインスタンスを生成することになります。で、内側の{}は、イニシャライザと呼ばれ、インスタンスが生成される時に、この中が実行されます。こちらはあんまり使われることはないので、憶えなくてもいいと思います ^^;。無名クラスはコンストラクタを持てないので、インスタンスの初期化は、イニシャライザを使うしかありません。別に二重の{というのに意味があるわけではないんです。応用で、ちょっとHashMapを作りたい場合は、こういうのも出来ます。JUnitで単体テストを書く時にテストデータを用意する場合なんかに便利ですね。 Map map = new HashMap() {{ put("A", "Apple"); put("B", "Book"); }};
これもいっしょで、new Interface名(){}の応用で、Interfaceがたまたまインナーインターフェースなだけです。「仮想的なクラス」は、正確には「無名クラス」(Anonumous class)といいます。理解は合っています。
そうですね。Javaでは色んな方法でクラス定義が出来ますから、最初は戸惑いますね。でも、この無名クラスは非常に有用で「一つのクラスを定義するまでもない、雑用クラス」を作る時には重宝します。特にアダプタクラス。ただ、これで大きなクラスを書くのは本末転倒なので、無名クラス、ローカルクラスにするのは、せいぜい10行程度に収まるクラスが対象です。 | ||||||||||||||||
|
投稿日時: 2003-05-13 22:11
北斗のポンさんへ
インデントが崩れてしまったので、わかりづらいのかもしれません。 この様にするとわかりませんか?
Getterはメンバーインターフェースです。 メンバーインターフェースは暗黙でstaticになるので、他のクラスから使うとき 『new Accumlation.Getter()』の様になります。
うのきちさんへ 『BBコード』の『CODEタグ』を使うと、タグで囲んだ部分の文字を等幅のフォントで、インデント付きの状態で表示されます。 zaxx_MDさんへ 私はうのきちさんの書き方は無駄がなく良いと思います。 この様な書き方が広く普及して欲しいと思っています。 | ||||||||||||||||
