2009-03-04 7 views
1

だから私のエントリポイントクラスの(つまりプログラムがpublic static void main(String args[])機能を有している(起動時に実行されるクラス)と言うことができます、そのクラスでは、私は、この変数を持っている:。JavaクラスはどのようにしてEntryクラスから情報を取得しますか?

private ArrayList<String> myData=new ArrayList<String>(); 

このクラスは、別のクラスをインスタンス化。?それはどのようにこのArrayListのを取得することができ、エントリポイントクラスのmyDataメンバーへのアクセス権を持っている必要があり

編集:私はこれを行うことができますmain()方法では、明確にする:

SomeOtherClass myClass=new SomeOtherClass(); 

その後、私は何ができる:

myClass.someMethod(); 

しかし、myClassオブジェクトに、私はこの方法を実行することができる方法/ myClassオブジェクトをインスタンス化した、エントリークラスから何かを取り出しますか?

答えて

2

たとえば、あなたのオブジェクトのコンストラクタは次のようになります。静的な世界からインスタンスに移動する必要があります。

私はあなたのメインメソッドをprivate construtorにリファクタリングして、それを新しいインスタンスとして起動する新しいmain()を追加します。

このコードは非常に粗いですが、あなたが何をする必要があるかを説明するのに役立つはずです。

public class EntryPoint { 
    private ArrayList<String> myData=new ArrayList<String>(); 

    public static void main(String[] args) { 
     EntryPoint ep = new EntryPoint(); 
     ep.init(); 
    } 

    private void init() { 
     // Populate myData perhaps? 

     SomeOtherClass myClass=new SomeOtherClass(); 
     myClass.someMethod(this); 
    } 

    public List<String> getMyData() { 
     return myData; 
    } 
} 

public class SomeOtherClass { 
    public void someMethod(EntryPoint entry) { 
     List<String> data = entry.getMyData(); 
     // do stuff with data..! 
    } 
} 
+0

私は一般的にEntryPointのコンストラクタでsomeMethod()を呼び出すことは避けています。たぶんdoWork()メソッドなどを追加するのでしょうか? –

+0

はい。私はそれがラフだと言った! – banjollity

+0

実際には、オブジェクトがまだ完全には作成されていないので、コンストラクタから "this"を安全に渡すことはできません。これにより、バグを追跡することが困難になります。このケースでは動作する可能性がありますが、それ以外のケースが数多くあります。 – TofuBeer

1

main()を含むクラスは単なる普通のクラスです。あなたの場合は、myDatapublic、おそらくstatic(またはもちろんアクセサを追加する)を行う必要があります。他のクラスと同じように。

また、このように、他のクラスにEntryオブジェクトを渡すことができます。

public static void main(String[] args) { 
    Entry entry = new Entry(); 
    SomeOtherClass myClass=new SomeOtherClass(entry); 
    // continue as before 
} 
+0

カプセル化問題! – banjollity

+0

はい。問題は、ArrayListが他の場所で使用されている場合、ArrayListがエントリクラスにある理由ですが、私はそれに対処していません。 –

2

あなたはmyDataへのアクセスをインスタンス化するクラスを提供する最良の方法は、それが作成されたとき、コンストラクタにそれを渡すことであろう。

次に、コンストラクタでArrayListをクラスのメンバ変数に保存できます。それは他のいくつかのクラスを呼び出しますが、あなたのArrayListがそれのインスタンスのメンバーであるとき、あなたのエントリポイントがまだ静的であるようですね

private ArrayList<String> myData; 

public YourObjConstructor(ArrayList<String> data){ 
    myData = data; 
} 
関連する問題