- PR -

別クラスのメソッドを使用する場合についての質問

投稿者投稿内容
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-11-19 17:39
引用:

takaさんの書き込み (2003-11-18 15:06) より:

public class Class_A {
 public Class_A {
  Class_B clsB = new Class_B(this);
 }
 
 void A_Method(){
 
 }
}

上記の設定の場合、クラスBの中でクラスAの"A_Method()"を使いたい場合、
下記のようにクラスBのコンストラクタの引数にクラスAを与えて、
下記のようにクラスAのメソッドを使っていますが、正しいのでしょうか?
public class Class_B {
 Class_A clsA;
 public Class_B(Class_A cls) {
  clsA = cls;
  clsA.A_Method();
 }
}


こういう風にするのも手ではないでしょうか?
# Class_B を Class_A の内部クラスにすることにより、A_Method メソッドを private にすることもできる。

コード:

public class Class_A {
    private Class_A.Class_B clsB = new Class_A.Class_B();
    private boolean blnA = false;

    private void A_Method() {
        this.blnA = true;
    }

    public class Class_B {
        public void B_Method() {
            Class_A.this.A_Method();
        }
    }
}


#こういうやり方ってあまり一般的じゃないのかなぁ?(^^;
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 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/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-11-19 18:35
ども、ほむらです。
単に僕の知識がついていっていないだけなのですが^^;;;;
--------------
架空兎氏へ
引用:

こういう風にするのも手ではないでしょうか?
# Class_B を Class_A の内部クラスにすることにより、A_Method メソッドを private にすることもできる。

コード:
public class Class_A {

private Class_A.Class_B clsB = new Class_A.Class_B();
private boolean blnA = false;

private void A_Method() {
this.blnA = true;
}

public class Class_B {
public void B_Method() {
Class_A.this.A_Method();
}
}
}



#こういうやり方ってあまり一般的じゃないのかなぁ?(^^;


スパゲッティプログラムの始まりじゃないでしょうか?
あと
private Class_A.Class_B = new Class_A.Class_B();
ってClass_Aのコンストラクタの前に処理されたりしないのでしょうか?

コンストラクタ内での処理で
インスタンスが確定しているか不明ということに問題があるので
根本解決にはならないのではないかななんて・・・・

taka氏へ
そもそものClass_AとClass_Bは親子関係を反対には出来ないのでしょうか?
Decoratorパターンの適用をかんがえてみるとかどうでしょうか?

別件なのですが・・
かずくん氏のコードはsingletonを応用したもののようなのですが
僕ではコンパイルが通せません。。。
後学のためにコンパイルの通る形のものを教えていただければなとおもいます^^;;;;;
コード:

public class test
{
class Class_A {
public static Class_A getInstance() {
Class_A a = new Class_A();
a.setCLass_B(new Class_B(a));
return a;
}

public void A_Method() {}

private void setClass_B(Class_B b) {
}

private Class_A() {}
}

public class Class_B {
Class_A clsA;
public Class_B(Class_A cls) {
clsA = cls;
clsA.A_Method();
}
}
public static void main(String arg[]){
Class_A clsA = Class_A.getInstance();
}
}


コード:

エラー内容
test.java:5: static でない 変数 this を static コンテキストから参照することはで
きません。
Class_A a = new Class_A();
^
test.java:6: static でない 変数 this を static コンテキストから参照することはで
きません。
a.setCLass_B(new Class_B(a));
^
test.java:6: シンボルを解決できません。
シンボル: メソッド setCLass_B (test.Class_B)
場所 : test.Class_A の クラス
a.setCLass_B(new Class_B(a));
^
test.java:4: 内部クラスが static 宣言を持つことはできません。
public static Class_A getInstance() {
^
エラー 4 個



#貼り付ける内容を間違えたので修正

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-11-19 18:37 ]
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-11-19 18:46
引用:

ほむらさんの書き込み (2003-11-19 18:35) より:

後学のためにコンパイルの通る形のものを教えていただければなとおもいます^^;;;;;


Class_AとClass_Bをtestクラスの外に出せばコンパイルが通ると思います。
インナークラスのインスタンスを作成するにはアウタークラスのインスタンスが必要ですね。

[追記]
Class_AとClass_Bにstaticをつける手も有ります。

[ メッセージ編集済み 編集者: ぽん 編集日時 2003-11-19 18:54 ]
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2003-11-19 18:51
ほむらさん、ご意見ありがとうございました。

>taka氏へ
>そもそものClass_AとClass_Bは親子関係を反対には出来ないのでしょうか?
出来ない場合、皆さんはどうされているのでしょうか?という質問です。
>Decoratorパターンの適用をかんがえてみるとかどうでしょうか?
"Decoratorパターン"というのはデザインパターンの一つですよね?
私自身まだ、デザインパターンの知識がないので勉強します。

ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-11-19 19:07
引用:

takaさんの書き込み (2003-11-19 18:51) より:
>taka氏へ
>そもそものClass_AとClass_Bは親子関係を反対には出来ないのでしょうか?
出来ない場合、皆さんはどうされているのでしょうか?という質問です。


このような設計をしないのが1番の解決法でしょうね・・・

引用:

>Decoratorパターンの適用をかんがえてみるとかどうでしょうか?
"Decoratorパターン"というのはデザインパターンの一つですよね?
私自身まだ、デザインパターンの知識がないので勉強します。


ぜひお勧めします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-11-19 19:13
unibon です。こんにちわ。

引用:

takaさんの書き込み (2003-11-19 10:59) より:
>ただ、なにをもくろまれているのかが、サンプルからはイマイチ分からないです。
>単に、Java におけるクラス間の関係をいろいろ試されているだけなのか、
>なにか目的があってこういうことをする必要があるのかの、どちらでしょうか。
前者です、クラス間での関係やガベージコレクションを勉強しています。


以下、聞き流す程度にしていただければと思います(あまり否定的なつもりはないです)が、
Java で複雑なプログラムを書いてもコンパイルが通れば、
実行時に出るエラーは NullPointerException と、
せいぜい ArrayIndexOutOfBoundsException 位で、
それ以外はとにかく動いてしまいます
(他のライブラリを呼ばない場合)。
でも重要なのは、目論見どおりに動くかということなのですが、
これは、なにか目的というかターゲットとなるモデルがないとやりにくいのでは、
と思います。
#いや、でもなにかこねくり回していると新たなデザインパターンが生み出されるかも?

なお、たくさんのクラス(インスタンスではなくクラス)を作った場合、
クラス間の関係は一般には片方向になります。
双方向という関係(クラスAとクラスBが互いに知り合っている等)は、
そんなにはありません。
また、雰囲気だけで書きますと、クラス間の関係がややこしくなっているのに
abstract(か interface)が登場しないのは変であることが多いです。
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-11-20 11:16
>ほむらさんへ

引用:

スパゲッティプログラムの始まりじゃないでしょうか?


何故そう思われたのでしょうか?
#そうなる可能性があるということは否定しませんが。。。^^;

私の意見としては Class_A のインスタンスを他のクラスへ使い回しする方が危険だと思います(使い方にもよると思いますが)。
#しかも Class_A と Class_B がお互いに参照しあっている。

引用:

private Class_A.Class_B = new Class_A.Class_B();
ってClass_Aのコンストラクタの前に処理されたりしないのでしょうか?

コンストラクタ内での処理で
インスタンスが確定しているか不明ということに問題があるので
根本解決にはならないのではないかななんて・・・・


すみません、これは私の例があまり良くありませんでした。

解決方法としては、要は 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 ]

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