1

次のコード クラス Agent.java があります。

 public class Agent {
      Helper helper ;

      private class SpecificBehaviour extends Behaviour{
         private Apple a;
         public SpecificBehaviour(Apple a){
          setApple(a);
          }
          public void setApple(Apple a){
           this.a=a;
          }
          public Apple getApple(){
          return a;
          }
         } 

         public void someMethod(){
         helper = new Helper(this);
        }   

}

Helper.java (同じパッケージ内の別のクラス) で getApple() メソッドにアクセスしたいと思います。いくつかの検索を行って、この リンク を見つけました。これを行うためのより良い/簡単な方法があるかどうか疑問に思っていますか?

4

4 に答える 4

4

ここには少なくとも 2 つの問題があります。

  • HelperSpecificBehaviourプライベートクラスなのでの存在を知りません。詳細を指定していないクラスについて潜在的に知っている可能性があります。が で宣言され、が に可視であるBehaviour場合、可視性の部分は問題になる必要はありません。getApple()BehaviourBehaviourHelper
  • Helperのインスタンスへの参照がSpecificBehaviour必要になります。つまり、 をインスタンス化する必要がありますSpecificBehaviour。そのためには、 のインスタンスも必要になります。これは、 が内部クラスAgentであるためです。そのような例があるかどうかは明らかではありません。SpecificBehaviour

基本的に、プライベート内部クラスの存在がここで混乱を招いていると思います。Java を初めて使用する場合は、当面はトップレベル クラスに固執することを強くお勧めします。それらにはいくつかの微妙な点があり、一度に 1 つのことを学ぼうとするのが最善です。

これが役に立たない場合は、より多くのコンテキストを提供してください - あなたの質問は現時点では非常に漠然としています. 内のどこで使用しますか? の状態の一部は のインスタンスへの参照であるべきですか、それともメソッド パラメータであるべきですか? のインスタンスを作成しましたか? どのように見えますか?これらの質問に 1 つずつ答える過程で、問題を自分でよりよく理解できることに気付くかもしれません。getAppleHelperHelperSpecificBehaviourAgentBehaviour

于 2012-11-30T07:16:34.253 に答える
0

Jon Skeet は次のように述べており、私はそれに完全に同意します。

ヘルパーには のインスタンスへの参照が必要SpecificBehaviourです。つまり、 をインスタンス化する必要がありますSpecificBehaviour。そのためには、 のインスタンスも必要になります。これは、 が内部クラスAgentであるためです。SpecificBehaviourそのような例があるかどうかは明らかではありません。

実際、以下のサンプル コードをテストすることで、あなたの試行がいかに奇妙であるかを理解できます。

Agent.java

public class Agent 
{
    private class SpecificBehaviour 
    {
        public String toString()
        {
            return "specific behaviour";
        }
    }
    public Class getInner() 
    {
        return SpecificBehaviour.class;
    }
}

Helper.java

public class Helper 
{
    public static void main(String[] args) 
    {
        try 
        {
            Agent agent = new Agent();
            System.out.println(agent.getInner().newInstance().toString());
        }
        catch (InstantiationException e) {  e.printStackTrace();  }
        catch (IllegalAccessException e) {  e.printStackTrace();  }
    }
}

上記のコードは問題なくコンパイルされます。そして、出力が何であるかを見てみましょう:

java.lang.InstantiationException: Agent$SpecificBehaviour
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    at Helper.main(Helper.java:5)
于 2012-11-30T07:29:11.640 に答える
0

-原則を使用Compositionして、メソッドへのアクセスを取得しますgetApple()

例えば:

public class Agent {

      Apple a = new Apple();     // Agent class has a reference of type Apple.

     .....
     .....
 }

- 2 番目の方法は、Apple クラスgetApple()でメソッドを作成し、クラス名と(ドット) 演算子を使用してAgent クラスからアクセスすることです。static.

例えば:

  public class Agent {

          public void go(){

            Apple.getApple();

        }

         .....
         .....
     }
于 2012-11-30T07:09:35.243 に答える
0

Agentに渡すオブジェクトにプライベート クラスHelperインスタンスを要求する必要がありますSpecificBehaviour。これが仕組みです。カプセル化を覚えています。

于 2012-11-30T07:10:40.140 に答える