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?
Ich schlage vor, dass Sie den entsprechenden Code und den vollständigen Fehler posten. –
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
Normalerweise bezieht sich '$' auf eine innere Klasse, keine öffentliche Klasse. Aber ohne den entsprechenden Code zu sehen, gebe ich diese Frage auf –