Java 从封闭类外部访问私有内部类的公共方法

Java 从封闭类外部访问私有内部类的公共方法,java,private,inner-classes,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 se

我有以下代码类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方法。做了一些搜索,发现了这个 我想知道是否有更好/更简单的方法

-使用Composition principle访问getApple方法

例如:

-第二种方法是使getApple方法在Apple类中是静态的,然后使用类名和从代理类访问它。点运算符

例如:

-使用Composition原理获得对getApple方法的访问权

例如:

-第二种方法是使getApple方法在Apple类中是静态的,然后使用类名和从代理类访问它。点运算符

例如:


您需要询问正在传递给助手的代理对象,以获取私有类SpecificBehavior的实例。这就是它的工作方式。封装请记住。

您需要询问要传递给帮助程序的代理对象,以获取私有类SpecificBehavior的实例。这就是它的工作方式。封装记住。

这里至少有两个问题:

Helper不知道特定行为的存在,因为它是一个私有类。它可能知道行为类,但您没有给出任何详细信息。如果getApple是在behavior中声明的,并且行为对Helper是可见的,那么可见性部分不一定是问题。 助手将需要对SpecificBehavior实例的引用,这意味着您需要实例化SpecificBehavior。为此,您还需要一个代理实例,因为SpecificBehavior是一个内部类。不清楚你是否有这样的例子。 基本上,我认为一个私有的内部类的存在在这里增加了混乱。如果您对Java相当陌生,我强烈建议您暂时坚持使用顶级类。他们有一些微妙之处,最好一次只学一件事


如果这没有帮助,请提供更多的背景-你的问题目前相当模糊。您希望在Helper中的何处使用getApple?助手状态的一部分应该是对SpecificBehavior实例的引用,还是应该是方法参数?您是否已创建代理的实例?行为是什么样子的?您可能会发现,在一次回答一个问题的过程中,您能够更好地自己解决问题。

这里至少有两个问题:

Helper不知道特定行为的存在,因为它是一个私有类。它可能知道行为类,但您没有给出任何详细信息。如果getApple是在behavior中声明的,并且行为对Helper是可见的,那么可见性部分不一定是问题。 助手将需要对SpecificBehavior实例的引用,这意味着您需要实例化SpecificBehavior。为此,您还需要一个代理实例,因为SpecificBehavior是一个内部类。不清楚你是否有这样的例子。 基本上,我认为一个私有的内部类的存在在这里增加了混乱。如果您对Java相当陌生,我强烈建议您暂时坚持使用顶级类。他们有一些微妙之处,最好一次只学一件事


如果这没有帮助,请提供更多的背景-你的问题目前相当模糊。您希望在Helper中的何处使用getApple?助手状态的一部分应该是对SpecificBehavior实例的引用,还是应该是方法参数?您是否已创建代理的实例?行为是什么样子的?您可能会发现,在一次一个地回答这些问题的过程中,您能够更好地自己解决问题。

Jon Skeet说,我完全同意这一点:

助手将需要对特定行为实例的引用, 这意味着您需要实例化特定的行为。为此,, 您还需要一个代理实例,因为SpecificBehavior是一个 内部阶级。不清楚你是否有这样的例子

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

Agent.java

Helper.java

上面的代码编译得很好。让我们看看输出是什么:

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)

Jon Skeet表示,我完全同意:

助手将需要对特定行为实例的引用, 这意味着您需要实例化特定的行为。为此,, 您还需要一个代理实例,因为SpecificBehavior是一个 内部阶级。不清楚你是否有这样的例子

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

Agent.java

Helper.java

j上面的代码 ust编译得很好。让我们看看输出是什么:

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)

只需OuterClass.InnerClass InnerClass=新建OuterClass.new InnerClass;只需OuterClass.InnerClass InnerClass=新建OuterClass.new InnerClass;
public class Agent 
{
    private class SpecificBehaviour 
    {
        public String toString()
        {
            return "specific behaviour";
        }
    }
    public Class getInner() 
    {
        return SpecificBehaviour.class;
    }
}
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)