Warum muss der Delegat statisch sein?

8

Im folgenden Code muss ich die Methode MdrResponseInterpreter static deklarieren, sonst habe ich einen Kompilierungsfehler.

%Vor%

Warum? Da _mdrResponseBuilder nicht statisch ist, erwarte ich, dass MdrResponseInterpreter auf this

zugreifen kann     
javapowered 28.03.2012, 09:17
quelle

4 Antworten

11

Weil Feldinitialisierer keinen Zugriff auf this / Instanzmitglieder haben. Verschieben Sie die Initialisierung in den Konstruktor, wenn Sie auf Instanzelemente zugreifen möchten.

Die Spezifikation sagt:

  

Ein Variableninitialisierer für ein Instanzfeld kann nicht auf die Instanz verweisen, die gerade erstellt wird. Daher ist es ein Fehler bei der Kompilierung, auf this in einem Variableninitialisierer

zu verweisen

Obwohl Ihr Code nicht explizit auf this verweist, referenziert die Methodengruppe, die die Konvertierung delegiert, this implizit, wenn es sich bei der Methode um ein Instanzenmitglied handelt.

    
CodesInChaos 28.03.2012 09:19
quelle
5

Um der Antwort von CodeInChaos (die korrekt ist) hinzuzufügen, können Sie einfach die Zuweisung zum Konstruktor verschieben:

%Vor%

BEARBEITEN: Das obige nimmt an, dass StandartBuilder ein Delegattyp ist. Wenn es sich um einen Typ mit einem Konstruktor handelt, der einen Delegattyp akzeptiert, müssen Sie zurück zu new StandartBuilder(MdrResponseInterpreter) gehen, aber immer noch im Konstruktor.

    
Jon Skeet 28.03.2012 09:20
quelle
1

Die Methode muss statisch sein, da sie bei der Objektinitialisierung aufgerufen wird, bevor der Konstruktor mit der Ausführung begonnen hat. Wenn Sie auf this zugreifen möchten, rufen Sie die Initialisierungsmethode in Ihrem Konstruktor auf.

    
Marnix van Valen 28.03.2012 09:20
quelle
1

Sie dürfen keine Instanzmitglieder in Initializern verwenden.

Stellen Sie sich einen Delegierten so vor, als hätte er 1) eine Objektreferenz und 2) eine Methodenreferenz. Da Sie nicht auf this zugreifen können, gibt es keine Möglichkeit, die Objektreferenz festzulegen. Daher besteht die einzige Möglichkeit, die Methode als Delegat zu verwenden, darin, sie als static zu deklarieren (weil die Objektverweis eines Delegaten null ist). für statische Methoden). Wenn Sie Ihre Initialisierung in den Konstruktor verschieben, können Sie dies umgehen.

    
Botz3000 28.03.2012 09:20
quelle