从Enclosing类外部访问Private Inner Class的公共方法

时间:2012-11-30 07:01:24

标签: java private inner-classes

我有以下代码类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()方法。做了一些搜索并找到了这个link  我想知道是否有更好/更简单的方法吗?

4 个答案:

答案 0 :(得分:4)

这里至少有两个问题:

  • Helper不知道SpecificBehaviour的存在,因为它是私人类。它可能可能知道Behaviour类,你没有提供任何细节。如果在getApple()中声明了Behaviour,并且BehaviourHelper可见,则可见性部分不一定是个问题。
  • Helper需要引用SpecificBehaviour的实例,这意味着您需要实例化SpecificBehaviour。为此,您还需要Agent的实例,因为SpecificBehaviour内部类。目前尚不清楚你是否拥有这样的实例。

基本上我认为私有内部类的存在会增加混乱。如果你是Java的新手,我强烈建议你暂时坚持使用顶级课程。他们周围有一些微妙之处,最好一次尝试学习一件事。

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

答案 1 :(得分: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();

        }

         .....
         .....
     }

答案 2 :(得分:0)

您需要向私人班级Agent实例询问您传递给Helper的{​​{1}}个对象。这是它的工作方式。封装记得。

答案 3 :(得分:0)

Jon Skeet表示,我完全同意:

  

Helper需要引用SpecificBehaviour的实例,   这意味着您需要实例化SpecificBehaviour。为了那个原因,   你还需要一个Agent的实例,因为SpecificBehaviour是一个。{1}}   内心阶级。目前尚不清楚你是否有这样的实例。

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

<强> 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)