231 votes

Accès au constructeur d'une classe anonyme

Supposons que je dispose d'une classe concrète Class1 et que je crée une classe anonyme à partir de celle-ci.

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

Est-il possible de surcharger le constructeur de cette classe anonyme ? Comme indiqué ci-dessous

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

Avec quelque chose à xxxxxxxx pour nommer le constructeur ?

7 votes

Il vaut la peine d'être lu DoubleBraceInitialisation

0 votes

Si le parent a un constructeur : stackoverflow.com/questions/20807148/

3voto

Oui, il est vrai que l'on ne peut pas définir de constructeur dans une classe anonyme, mais cela ne signifie pas que les classes anonymes n'ont pas de constructeur. Confusion... En fait, vous ne pouvez pas définir de construction dans une classe anonyme, mais le compilateur génère un constructeur pour elle avec la même signature que le constructeur appelé par son parent. Si le parent a plus d'un constructeur, la classe anonyme aura un et un seul constructeur.

2voto

Diogo Quintela Points 191

Peter Norvig's The Java IAQ : Infrequently Answered Questions (en anglais)

http://norvig.com/java-iaq.html#constructors - Constructeurs de classes anonymes

http://norvig.com/java-iaq.html#init - Constricteurs et initialisation

En résumé, vous pouvez construire quelque chose comme ceci

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

2voto

user1352530 Points 987

Si vous n'avez pas besoin de passer des arguments, le code d'initialisation suffit, mais si vous devez passer des arguments à partir d'un contrôleur, il existe un moyen de résoudre la plupart des cas :

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

1voto

Ilja Preuß Points 1914

Cela n'a aucun sens d'avoir un constructeur surchargé nommé dans une classe anonyme, car il n'y aurait de toute façon aucun moyen de l'appeler.

En fonction de ce que vous essayez de faire, l'accès à une variable locale finale déclarée en dehors de la classe, ou l'utilisation d'un initialisateur d'instance comme l'a montré Arne, peut être la meilleure solution.

1voto

arnaldocan Points 21

Dans mon cas, une classe locale (avec un constructeur personnalisé) fonctionnait comme une classe anonyme :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X