簡體   English   中英

從Enclosing類外部訪問Private Inner Class的公共方法

[英]Accessing public methods of a Private Inner Class, from outside the Enclosing class

我有以下代碼類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()方法。 做了一些搜索,發現這個鏈接,我想知道是否有更好/更簡單的方法這樣做?

這里至少有兩個問題:

  • Helper不知道SpecificBehaviour的存在,因為它是一個私人類。 可能知道Behaviour類,你沒有提供任何細節。 如果在Behaviour聲明了getApple() ,並且如果Helper可以看到Behaviour ,那么可見性部分不一定是個問題。
  • Helper需要引用SpecificBehaviour的實例,這意味着您需要實例化SpecificBehaviour 為此,您還需要一個Agent實例,因為SpecificBehaviour是一個內部類 目前尚不清楚你是否這樣的實例。

基本上我認為私人內部階級的存在在這里增加了混亂。 如果你是Java的新手,我強烈建議你暫時堅持使用頂級課程。 他們周圍有一些微妙之處,最好一次嘗試學習一件事。

如果這沒有幫助,請提供更多背景信息 - 您的問題目前非常模糊。 您希望在哪里使用getAppleHelper Helper狀態的一部分應該是對SpecificBehaviour實例的引用,還是應該是方法參數? 您是否創建了Agent實例? Behaviour什么樣的? 您可能會發現,在逐個回答這些問題的過程中,您可以更好地為自己找出問題所在。

-使用Composition原理來訪問getApple()方法。

例如:

public class Agent {

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

     .....
     .....
 }

-第二種方法是在Apple類中使getApple()方法static ,然后使用Class name從Agent類訪問它. (點)運算符。

例如:

  public class Agent {

          public void go(){

            Apple.getApple();

        }

         .....
         .....
     }

您需要詢問您要傳遞給HelperAgent對象,以獲取私有類SpecificBehaviour實例 這是它的工作方式。 封裝記得。

Jon Skeet表示,我完全同意:

Helper需要引用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM