source

익명 클래스의 생성자 액세스

factcode 2022. 8. 29. 22:06
반응형

익명 클래스의 생성자 액세스

구체적인 Class1이 있고 이 Class1에서 익명 클래스를 만들고 있다고 가정해 보겠습니다.

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

이 익명의 수업의 제작자에게 과부하를 줄 수 있는 방법은 없을까?아래와 같이

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

xxxxxxxxxxxxxxxxxxxxxxxxx에 있는

Java Language Specification, 섹션 15.9.5.1에서 다음을 수행합니다.

익명 클래스에는 명시적으로 선언된 생성자를 사용할 수 없습니다.

죄송합니다.

EDIT: 또는 최종 로컬 변수를 만들거나 익명 클래스에 인스턴스 이니셜라이저를 포함할 수 있습니다.예를 들어 다음과 같습니다.

public class Test {
    public static void main(String[] args) throws Exception {
        final int fakeConstructorArg = 10;

        Object a = new Object() {
            {
                System.out.println("arg = " + fakeConstructorArg);
            }
        };
    }
}

맛없지만 도움이 될 수도 있어또는 적절한 네스트클래스를 사용합니다.

이는 불가능하지만 다음과 같이 어나니머스 이니셜라이저를 추가할 수 있습니다.

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

  void someNewMethod() {
  }
};

anInt의 경우와 마찬가지로 익명의 클래스에서 사용되는 로컬 변수 또는 파라미터 선언에 대한 final을 잊지 마십시오.

이 문제를 해결하는 또 다른 방법은 다음과 같습니다.

public class Test{

    public static final void main(String...args){

        new Thread(){

            private String message = null;

            Thread initialise(String message){

                this.message = message;
                return this;
            }

            public void run(){
                System.out.println(message);
            }
        }.initialise(args[0]).start();
    }
}

답글을 올리기에는 너무 오래된 줄 알아요.하지만 난 여전히 그럴 가치가 있다고 생각해.

명시적 생성자를 가질 수는 없지만 슈퍼 클래스의 보호된 생성자를 호출하려면 다음 작업만 하면 됩니다.

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

다음 예시는 봄철에 오브젝트를 작성하는 방법으로DataSource a. a. a.String★★★★★★ 。

즉, 어나니머스 클래스를 만들고 슈퍼 클래스 컨스트럭터를 호출하려면 슈퍼 클래스 컨스트럭터와 일치하는 시그니처를 사용하여 어나니머스 클래스를 만듭니다.

예. Anonymous 클래스에 구성을 정의할 수 없지만 익명 클래스에 생성자가 없는 것은 아닙니다.헷갈려...실제로 Anonymous 클래스에서 컨스트럭터를 정의할 수는 없지만 컴파일러는 부모 컨스트럭터 호출과 동일한 시그니처를 가진 컨스트럭터를 생성합니다.부모에 둘 이상의 생성자가 있는 경우 익명에는 생성자가 하나뿐입니다.

abstract 클래스에는 init 파라미터를 받아들이는 컨스트럭터를 설정할 수 있습니다.Java 사양은 (옵션으로) 추상 클래스 또는 인터페이스 구현의 자손인 익명 클래스가 자신의 권한으로 컨스트럭터를 가질 수 없음을 지정합니다.

다음 절대적이고 가능한:합법적이다.

static abstract class Q{
    int z;
    Q(int z){ this.z=z;}
    void h(){
        Q me = new Q(1) {
        };
    }
}

만약 당신이, 그곳에 그러한 생성자 넣고 가능성을 직접 추상 클래스를 쓰게 된다가 없는 더 좋은 해답은 유창한 API를 사용하다.넌 이렇게와를 인스턴스화하고 당신의 익명의 수업할 당신의 원래 클래스 변수와 생성자를 가진 이름의 형제들 간의 클래스를 만들의 생성자 우선할 수 있다.

만약 논쟁 합격에 필요한 별로 없어 그 이니셜 라이저 코드는 충분하지만 만약 contrcutor 엔드 투 엔드 원칙에서 합격에 필요한 방법이 대부분의 사건을 해결하는 것이다:.

Boolean var= new anonymousClass(){
    private String myVar; //String for example

    @Overriden public Boolean method(int i){
          //use myVar and i
    }
    public String setVar(String var){myVar=var; return this;} //Returns self instane
}.setVar("Hello").method(3);

피터 Norvig 있는 자바 실내 공기 질:Infrequently와 대답했다.

http://norvig.com/java-iaq.html#constructors-익명 클래스 contructors

http://norvig.com/java-iaq.html#init-Construtors과 초기화

Summing, 당신은 이런 무언가를 생성할 수 있다.

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;
    }
}

을 것이기 때문에 방법이 없어 어쨌든,라고 요청하는 것은 익명의 수업에서 명명된 오버 로드된 생성자, 납득이 되질 않아요.

실제로는 할, 또는 인스턴스에 대한 이니셜 라이저로 아르네에 의해를 최종 지역 변수는 수업 시간 외에 선언했다에 접속하는 것들이 무엇인가에 따라 수 있는 최선의 해결책이다.

내 경우, 지방의 클래스(사용자 지정 생성자를)익명의 클래스로: 일했다.

Object a = getClass1(x);

public Class1 getClass1(int x) {
  class Class2 implements Class1 {
    void someNewMethod(){
    }
    public Class2(int a){
      super();
      System.out.println(a);
    }
  }
  Class1 c = new Class2(x);
  return c;
}

언급URL:https://stackoverflow.com/questions/362424/accessing-constructor-of-an-anonymous-class

반응형