[java] 訪問匿名類的構造函數


Answers

這是不可能的,但你可以像這樣添加一個匿名初始化器:

final int anInt = ...;
Object a = new Class1()
{
  {
    System.out.println(anInt);
  }

  void someNewMethod() {
  }
};

不要忘記最後對匿名類使用的局部變量或參數的聲明,就像我為anInt所做的那樣。

Question

假設我有一個具體的Class1類,我正在創建一個匿名類。

Object a = new Class1(){
        void someNewMethod(){
        }
      };

現在有什麼辦法可以重載這個匿名類的構造函數。 如下所示

Object a = new Class1(){
        void someNewMethod(){
        }
        public XXXXXXXX(int a){
          super();
          System.out.println(a);
        }
      };

用xxxxxxxx命名構造函數?




在匿名類中有一個名為重載的構造函數沒有任何意義,因為無論如何都無法調用它。

取決於你實際嘗試做什麼,只需訪問在類之外聲明的最終局部變量,或者使用Arne所示的實例初始化程序,可能是最好的解決方案。




我知道線程太舊而無法發布答案。 但我仍然認為這是值得的。

雖然你不能有一個明確的構造函數,但如果你的意圖是調用超類的構造函數,那麼以下就是你所要做的。

StoredProcedure sp = new StoredProcedure(datasource, spName) {
    {// init code if there are any}
};

這是通過傳遞一個DataSource和一個String像在Spring中創建一個StoredProcedure對象的例子。

所以底線是,如果你想創建一個匿名類並且想要調用超類構造函數,那麼創建一個匿名類並且簽名與超類構造函數相匹配




Peter Norvig的“Java IAQ:不常見問題解答”

http://norvig.com/java-iaq.html#constructors - 匿名類構造器

http://norvig.com/java-iaq.html#init - 建設者和初始化

總結一下,你可以構建像這樣的東西..

public class ResultsBuilder {
    Set<Result> errors;
    Set<Result> warnings;

...

    public Results<E> build() {
        return new Results<E>() {
            private Result[] errorsView;
            private Result[] warningsView;
            {
                errorsView = ResultsBuilder.this.getErrors();
                warningsView = ResultsBuilder.this.getWarnings();
            }

            public Result[] getErrors() {
                return errorsView;
            }

            public Result[] getWarnings() {
                return warningsView;
            }
        };
    }

    public Result[] getErrors() {
        return !isEmpty(this.errors) ? errors.toArray(new Result[0]) : null;
    }

    public Result[] getWarnings() {
        return !isEmpty(this.warnings) ? warnings.toArray(new Result[0]) : null;
    }
}



是的,您無法在Anonymous類中定義構造是正確的,但這並不意味著匿名類沒有構造函數。 混淆......實際上你不能在Anonymous類中定義結構,但是編譯器為它生成一個構造函數,它與它所調用的父構造函數具有相同的簽名。 如果父項具有多個構造函數,則匿名將具有一個且只有一個構造函數




Links