JavaFX Javafx Dependency-Inversion

Diskutiere Javafx Dependency-Inversion im AWT, Swing, JavaFX & SWT Bereich.
L

lusitano

Moin.

Ich arbeite mich gerade in das Thema Dependency-Inversion ein. Scheitere aber dann wenn ich in meinem Controller einen Constructor erstelle um mir aus einer anderen Klasse eine Methode aufrufen zu lassen. hier bekomme ich dann eine NulPointerException.
Wo liegt den hier mein Fehler ? bzw was muss ich hier beachten?

// constructor inm controller
Code:
    private SpinnerWeightValueFactory spinnerWeigth;

    public ReefRockCalcController(SpinnerWeightValueFactory spinnerWeigth) {
        super();
        this.spinnerWeigth = spinnerWeigth;
    }
// aufruf der methode um die valueFactory zu holen
Code:
    private void getSpinnerValueFactory() {
    
        spReefRockWeight.setValueFactory(spinnerWeigth.getDoubleSpinnerValueFactory());
        
    }
Schon mal Danke fürs Antworten.

Grüße Lusitano
 
MoxxiManagarm

MoxxiManagarm

Ich vermute mal spReefRockWeight ist null und du versuchst auf dieses NullObject die setValueFactory Methode aufzurufen. Woher kommt spReefRockWeight ?
 
MoxxiManagarm

MoxxiManagarm

Ist vielleicht SpinnerWeightValueFactory null wenn du den Konstruktor aufrufst?
 
L

lusitano

hmm. Also ich glaube ich bin hier auf dem falschen Weg.

ich dachte das ich mit Dependency-Inversion wohl nur die referenz Variablen erstellen und einen constructor in den controller verbaue
Wohl geht das so nicht wie ich es mir, zugegeben, recht einfach gedacht habe,

Mit der einfachste Weg wäre wohl ein DI Framework zu verwenden . `??
 
T

temi

Und ohne irgend ein DI Framework funktioniert das nicht einfach so.
Das ist nicht ganz richtig, denn das ist auch bereits Dependency Injection, genauer gesagt, Constructor Injection:
Java:
class Foo {
    private Bar bar;
    
    Foo(Bar bar) {
        this.bar = bar;
    }

    // ...
}
Ohne wäre:
Java:
class Foo {
    private Bar bar = new BarImpl();
    
    // ...
}
Aber ich glaube du meinst damit, dass man ohne DI-Framework natürlich selbst den Konstruktor mit den passenden Abhängigkeiten aufrufen muss. Insofern hast du dann wieder Recht.
 
L

lusitano

Ich würde gerne bei dem constructor injection noch mal nachhaken

Kann das im Controller ohne weiteres durchführen ?
Also


Code:
private Referenzvariable referenz;

public MainController(Referenzvariable referenz) {
    this.referenz = referenz;
}
oder geht das in FX nicht ?
 
T

temi

Ich würde gerne bei dem constructor injection noch mal nachhaken

Kann das im Controller ohne weiteres durchführen ?
Also


Code:
private Referenzvariable referenz;

public MainController(Referenzvariable referenz) {
    this.referenz = referenz;
}
oder geht das in FX nicht ?
Wenn du irgendwo new MainController() aufrufst, kannst du als Parameter übergeben, was du dir wünscht.
 
T

temi

Hier ist der guide zu Google Guice. Da wird der Weg von kein DI bis zum DI-Framework mit Zwischenschritten gezeigt.
 
L

lusitano

Das werde ich mir mal anschauen. Danke dir.

Denke aber das ich da mit einem Framework wie Spring doch noch weiter kommen werde.
 
T

temi

Das werde ich mir mal anschauen. Danke dir.

Denke aber das ich da mit einem Framework wie Spring doch noch weiter kommen werde.
Das war jetzt nicht als Empfehlung für Guice gedacht. Ich finde nur die Erklärungen ganz gut gelungen.

Was für deine Anwendung richtig ist, musst du entscheiden.
 
L

lusitano

Moin Leute,
vielleicht kann hier jemand noch mal eine Hilfe geben.
Ich möchte im folgendem Beispiel initial in meiner UI einen default Wert im Spinner anzeigen lassen.
dazu habe ich erstellt
Interface für doubleValueFactory
Code:
public interface ISpinnerDoubleValueFactory {

    public DoubleSpinnerValueFactory getDoubleSpinnerValueFactory();
}
Das implementiere ich in
Code:
public class SpinnerWeightValueFactory implements ISpinnerDoubleValueFactory {

    @Override
    public DoubleSpinnerValueFactory getDoubleSpinnerValueFactory() {
        
        DoubleSpinnerValueFactory weight = new DoubleSpinnerValueFactory(000.000, 1000.000, 00.00, 0.500);
        
        return weight;
    }
    
}
In meinem controller habe ich eine Referenzvariable auf das interface ISpinnerDoubleValueFactory
und erstelle mir einen constructor aus dem controller
Code:
    @FXML
    private Spinner<Double> spReefRockWeight;

    private ISpinnerDoubleValueFactory spinnerDoubleValue;
    
    public ReefRockCalcController(ISpinnerDoubleValueFactory spinnerDoubleValue) {
        super();
        this.spinnerDoubleValue = spinnerDoubleValue;
    }

    public ReefRockCalcController() {
        super();
    }
so und ab hier komme ich nicht mehr weiter. Was muss ich den genau tun um in meinen Spinner die ValueFactory zu setzen ?

Danke schon mal.
 
mrBrown

mrBrown

und erstelle mir einen constructor aus dem controller
??

so und ab hier komme ich nicht mehr weiter.
Erstmal sollte der parameterlose Konstruktor gelöscht werden, der ist überflüssig.

Was muss ich den genau tun um in meinen Spinner die ValueFactory zu setzen ?
Was meinst du mit "in deinen Spinner die ValueFactory zu setzen"?

In deinem Konstruktor setzt du eine ISpinnerDoubleValueFactory. Solange der Konstruktor aufgerufen wird (was du sicher stellst in dem es der einzige ist), ist deine ISpinnerDoubleValueFactory gesetzt.


(Und du solltest an deiner Benennung arbeiten, die ist schon sehr verwirrend...)
 
L

lusitano

Hi @mrBrown
danke vorab.


Erstmal sollte der parameterlose Konstruktor gelöscht werden, der ist überflüssig.
Lösche ich den bekomme ich das hier
Code:
Caused by: java.lang.NoSuchMethodException: mainui.reeftankmanagement.reefrockCalc.ReefRockCalcController.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3349)
    at java.base/java.lang.Class.newInstance(Class.java:556)
    ... 79 more
 
mrBrown

mrBrown

Das ist zu erwarten, du musst entweder ein DI-Framework nutzen, oder die Controller selbst erzeugen.

Genannt wurden hier ja schon Spring und Guice, möglich wären auch CDI und Dagger.
 
L

lusitano

ok. Dann werde ich mich mal um Spring kümmern.
Vielen Dank noch mal fürs drüber schauen.
 
Thema: 

Javafx Dependency-Inversion

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben