- - PR -
別クラスのメソッドを使用する場合についての質問
| 投稿者 | 投稿内容 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-11-19 17:39
こういう風にするのも手ではないでしょうか? # Class_B を Class_A の内部クラスにすることにより、A_Method メソッドを private にすることもできる。
#こういうやり方ってあまり一般的じゃないのかなぁ?(^^; | ||||||||||||||||
|
投稿日時: 2003-11-19 18:01
H2さん、架空兎さん、ご意見ありがとうございました。
>clsCが参照していたClass_Cのオブジェクトは clsC=null; でGCによって開放されてしまい >ます。この時点でclsCが参照していたClass_Cのオブジェクトを参照している物が何もないか >らです。逆に、clsCが参照していたオブジェクトが開放された後でも、clsCが参照していたC >lass_AのオブジェクトはClass_Bのオブジェクトが参照しているのでまだメモリ上に残りま >す。 頭がゴチャゴチャになりそうでしたが、なんとか多分理解できたと思います。 ありがとうございました。 >Class_B を Class_A の内部クラスにすることにより、A_Method メソッドを private にす >ることもできる。 この方法は知りませんでした。この場合のメリットとデメリットとはなんでしょうか? | ||||||||||||||||
|
投稿日時: 2003-11-19 18:35
ども、ほむらです。
単に僕の知識がついていっていないだけなのですが^^;;;; -------------- 架空兎氏へ
スパゲッティプログラムの始まりじゃないでしょうか? あと private Class_A.Class_B = new Class_A.Class_B(); ってClass_Aのコンストラクタの前に処理されたりしないのでしょうか? コンストラクタ内での処理で インスタンスが確定しているか不明ということに問題があるので 根本解決にはならないのではないかななんて・・・・ taka氏へ そもそものClass_AとClass_Bは親子関係を反対には出来ないのでしょうか? Decoratorパターンの適用をかんがえてみるとかどうでしょうか? 別件なのですが・・ かずくん氏のコードはsingletonを応用したもののようなのですが 僕ではコンパイルが通せません。。。 後学のためにコンパイルの通る形のものを教えていただければなとおもいます^^;;;;;
#貼り付ける内容を間違えたので修正 [ メッセージ編集済み 編集者: ほむら 編集日時 2003-11-19 18:37 ] | ||||||||||||||||
|
投稿日時: 2003-11-19 18:46
Class_AとClass_Bをtestクラスの外に出せばコンパイルが通ると思います。 インナークラスのインスタンスを作成するにはアウタークラスのインスタンスが必要ですね。 [追記] Class_AとClass_Bにstaticをつける手も有ります。 [ メッセージ編集済み 編集者: ぽん 編集日時 2003-11-19 18:54 ] | ||||||||||||||||
|
投稿日時: 2003-11-19 18:51
ほむらさん、ご意見ありがとうございました。
>taka氏へ >そもそものClass_AとClass_Bは親子関係を反対には出来ないのでしょうか? 出来ない場合、皆さんはどうされているのでしょうか?という質問です。 >Decoratorパターンの適用をかんがえてみるとかどうでしょうか? "Decoratorパターン"というのはデザインパターンの一つですよね? 私自身まだ、デザインパターンの知識がないので勉強します。 | ||||||||||||||||
|
投稿日時: 2003-11-19 19:07
このような設計をしないのが1番の解決法でしょうね・・・
ぜひお勧めします。 | ||||||||||||||||
|
投稿日時: 2003-11-19 19:13
unibon です。こんにちわ。
以下、聞き流す程度にしていただければと思います(あまり否定的なつもりはないです)が、 Java で複雑なプログラムを書いてもコンパイルが通れば、 実行時に出るエラーは NullPointerException と、 せいぜい ArrayIndexOutOfBoundsException 位で、 それ以外はとにかく動いてしまいます (他のライブラリを呼ばない場合)。 でも重要なのは、目論見どおりに動くかということなのですが、 これは、なにか目的というかターゲットとなるモデルがないとやりにくいのでは、 と思います。 #いや、でもなにかこねくり回していると新たなデザインパターンが生み出されるかも? なお、たくさんのクラス(インスタンスではなくクラス)を作った場合、 クラス間の関係は一般には片方向になります。 双方向という関係(クラスAとクラスBが互いに知り合っている等)は、 そんなにはありません。 また、雰囲気だけで書きますと、クラス間の関係がややこしくなっているのに abstract(か interface)が登場しないのは変であることが多いです。 | ||||||||||||||||
|
投稿日時: 2003-11-20 11:16
>ほむらさんへ
何故そう思われたのでしょうか? #そうなる可能性があるということは否定しませんが。。。^^; 私の意見としては Class_A のインスタンスを他のクラスへ使い回しする方が危険だと思います(使い方にもよると思いますが)。 #しかも Class_A と Class_B がお互いに参照しあっている。
すみません、これは私の例があまり良くありませんでした。 解決方法としては、要は Class_B から Class_A のメソッドが実行されるタイミングを、 Class_A のコンストラクタが実行された後になればいいだけだと思うので、 私の例で言うと Class_B のインスタンスの生成を Class_A のコンストラクタではなくメソッドで行うのが良いかと思います。 #他にもやり方はあると思いますが。 > taka さんへ
#私もそれほど深くは考えたことがないのですが(汗) 内部クラスを使った方法で考えられるメリットは、 A_Method メソッドを private とすることでそのメソッドが他のクラスから実行されることを 防ぐことができる。 #内部クラスを使わないと恐らくできないはず。 あと、他のクラスから Class_B のインスタンスの生成を防ぐことができる。 デメリットは、 内部クラスから外側のクラスのメソッドやフィールドにアクセスする際、 どういうタイミングで行うかを考え、Class_A の状態をきちんと把握することができるように作る必要がある。 #すみません、これくらいしか思いつきませんでした。。。(他にもあるかも知れません) まあ、簡単に言うと内部クラスの特性をきちんと考えて使えばメリットになるし、 誤った使い方をするとデメリットになる、という感じでしょうか。 #私の発言に間違いがあるようであれば誰かご指摘頂けると幸いです。 #私も内部クラスについてそれほど詳しい知識はないので・・・(汗) [ メッセージ編集済み 編集者: 架空兎 編集日時 2003-11-20 11:20 ] [ メッセージ編集済み 編集者: 架空兎 編集日時 2003-11-20 11:28 ] [ メッセージ編集済み 編集者: 架空兎 編集日時 2003-11-20 11:46 ] | ||||||||||||||||
