2

Ich erstelle eine Android-Anwendung, die eine AAR-Datei verwendet, die eine Klasse hat, die das Builder-Muster verwendet. Ich vermute jedoch, dass dies ein einfaches altes Java-Problem ist.Kann Methodenaufrufe für Builder-Muster mit kompilierter innerer Klasse nicht ketten

Alles funktioniert gut, wenn ich nicht eine der verketteten Setter-Methoden verwenden:

ProjectConfig config = new ProjectConfig$Builder("reqparam0") 
         .build() // this works fine 

aber sobald ich alle angekettet Setter-Methoden zu verwenden versuchen,

ProjectConfig config = new ProjectConfig$Builder("reqParam0") 
         .contactEmail("optParam0") 
         .build() // ERROR - can't find build() method 

Ich weiß, dass Es gibt kein Problem mit der Builder-Implementierung selbst, wie ich es gebaut habe und es funktioniert gut, wenn es ohne zuerst kompiliert und in eine andere Anwendung als aar-Datei gepackt wird.

Beachten Sie, dass ich den '$' Accessor anstelle des normalen 'verwenden muss.' Weil es eine bereits kompilierte Klasse ist. Ich vermute, das hat auch etwas mit dem Problem zu tun. Hier

ist die Klasse:

public class ProjectConfig { 
    private final String apiKey; 
    private final boolean batterySavingMode; 
    private final String contactEmail; 

    public ProjectConfig(Builder builder) { 
    apiKey = builder.apiKey; 
    batterySavingMode = builder.batterySavingMode; 
    contactEmail = builder.contactEmail; 
    } 

    public String getApiKey() { 
    return apiKey; 
    } 

    public boolean isBatterySavingMode() { 
    return batterySavingMode; 
    } 

    public String getContactEmail() { 
    return contactEmail; 
    } 

    public static class Builder{ 
    // Required parameters 
    private String apiKey; 

    // Optional parameters 
    private boolean batterySavingMode = false; 
    private String contactEmail = null; 

    public Builder(String apiKey){ 
     this.apiKey = apiKey; 
    } 

    public Builder batterySavingMode(boolean enabled){ 
     this.batterySavingMode = enabled; 
     return this; 
    } 

    public Builder contactEmail(String contactEmail) { 
     this.contactEmail = contactEmail; 
     return this; 
    } 

    public ProjectConfig build(){ 
     return new ProjectConfig(this); 
    } 
} 

}

Kann jemand etwas Licht auf, was möglicherweise das Problem verursacht?

+0

Ich schlage vor, dass Sie den entsprechenden Code und den vollständigen Fehler posten. –

+0

Das Builder-Muster wird auf die normale Weise implementiert, wobei die verketteten Methoden 'this' zurückgeben. Außerdem sagt meine IDE, dass die verkettete Methode 'ExampleClass.Builder' und nicht 'ExampleClass $ Builder' zurückgibt. – Cognitio

+0

Normalerweise bezieht sich '$' auf eine innere Klasse, keine öffentliche Klasse. Aber ohne den entsprechenden Code zu sehen, gebe ich diese Frage auf –

Antwort

0

Dies ist tatsächlich ein Kompilierungsfehler. Die Methoden, die die IDE nicht finden kann, werden rot und sagen: "Methode kann nicht aufgelöst werden".

Es scheint jedoch ein Fehler mit der IDE zu sein ... zumindest die Methode wird zur Laufzeit gefunden, weil ich es getestet habe und alles läuft reibungslos, wenn die Anwendung ausgeführt wird.

Ich habe sogar den Debugger überprüft, und ein ProjectConfig-Objekt wird mit den richtigen Werten erstellt, sogar für die Methode, die es sagt, kann es nicht auflösen.

So wie es scheint, würde dies als Fehlerbericht zu JetBrains besser dran ...