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

这里至少有两个问题:

  • Helper不知道 的存在SpecificBehaviour,因为它是一个私有类。它可能知道Behaviour您没有提供任何详细信息的课程。如果getApple()在 中声明Behaviour,并且如果Behaviour对 可见Helper,那么可见性部分就不是问题。
  • Helper将需要对 的实例的引用SpecificBehaviour,这意味着您需要实例化SpecificBehaviour. 为此,您还需要一个 , 的实例Agent,因为SpecificBehaviour它是一个内部类。不清楚你是否这样的例子。

基本上我认为私有内部类的存在在这里增加了混乱。如果您对 Java 相当陌生,我强烈建议您暂时坚持使用顶级类。他们周围有一些微妙之处,最好一次尝试学习一件事。

如果这没有帮助,请提供更多背景信息 - 您的问题目前非常模糊。你想在哪里使用?状态的一部分应该是对 的实例的引用,还是应该是方法参数?您是否创建了 的实例?看起来像什么?您可能会发现,在一次回答一个问题的过程中,您能够更好地自己找出问题所在。getAppleHelperHelperSpecificBehaviourAgentBehaviour

于 2012-11-30T07:16:34.253 回答
0

-使用Composition原理来获取getApple()方法的访问权限。

例如:

public class Agent {

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

     .....
     .....
 }

-第二种方法是在Apple 类getApple()中创建方法,然后使用带有(点)运算符的类名从代理类访问它。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 回答
0

Jon Skeet 表示,我完全同意:

Helper 将需要对 的实例的引用SpecificBehaviour,这意味着您需要实例化SpecificBehaviour. 为此,您还需要 , 的实例Agent,因为SpecificBehaviour它是一个内部类。不清楚你是否有这样的例子。

实际上,您可以通过测试下面的示例代码来了解您的尝试有多奇怪:

代理.java

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

助手.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 回答