Java 从封闭类外部访问私有内部类的公共方法
我有以下代码类Agent.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
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)