JavaFX Mehrfache Benutzung von Methoden einer Klasse

Java20134

Bekanntes Mitglied
Hallo,

Ich habe eine Klasse A erstellt, in welcher man verschiedene get Methoden finden kann. In anderen Klassen, welche nicht in Beziehung zu der Klasse A stehen, werden die get Methoden aber benötigt. Kennt ihr einen schönen Lösungsvorschlag wie ich dieses Problem lösen kann, denn ich möchte die Methoden nicht static machen und außerdem ist es sehr unschön, wenn ich immer wieder die Klasse A weitergebe, um ihre Methoden nutzen zu können.

Vielen Dank! :)
 

Java20134

Bekanntes Mitglied
Ist es eine gute Loesung das Singelton Factory Design Pattern anzuwaenden und die Parameter des Konstruktors ueber eine Methode zu uebergeben?
 

Saheeda

Top Contributor
Was spricht dagegen, jedes Mal eine neue lokale Instanz zu erstellen? Bei Services z.B. arbeite ich nur sehr selten immer wieder mit demselben Objekt, sondern jeder Controller bekommt ein eigenes. Vorteil: Die Controller arbeiten absolut unabhängig voneinander und ich muss mir keine Gedanken um Nebeneffekte machen.
 

Tobse

Top Contributor
Wenn du die Informationen, welche von den Gettern kommen, im gesamten Programm brauchst (und sie von A sinnvollerweise zur Verfügung gestellt werden), sehe ich kein Problem darin, die Klasse A auch so oft zu verwenden - sie spielt anscheinend eine wichtige Rolle in deiner Software.

Anstatt hier auf ein Singleton zu setzen würde ich - wie Saheeda schon angedeutet hat - auf Dependency Injection setzen; da gibts auch schon fertige Lösungen für. Ob du dann A als Singleton nimmst, oder jeder Programmteil, der die Infos braucht, eine neue Instanz liegt, kommt dann wieder auf A an; da können wir ohne mehr Infos keine genauen Tipps geben.
 

Saheeda

Top Contributor
Ich würde nicht mal so weit gehen, Dependency Injection zu verwenden, sondern die Objekte selbst an Ort und Stelle instanzieren. Wenn der TE noch Anfänger ist, ist das zu viel "Magic" und kann nur unnötig verwirren.
 

Java20134

Bekanntes Mitglied
Die mehreren lokalen Instanzen sind möglich und keine schlechte Idee. Ich habe aber den Nachteil, dass in der Klasse A Parameter gebraucht werden, welche ich in den anderen Klasse nicht habe. Dadurch hatte ich gedacht, dass ich das Singleton Factory Pattern nutze.

Außerdem habe ich zu jedem Controller schon ein Model und muss nicht unbedingt noch ein Model hinzufügen.
 

Saheeda

Top Contributor
Kannst du die Parameter nicht entsprechend durchreichen? Wenn du in einem Controller mehrere Models mit sehr loser Beziehung hast, kann das ein Indiz sein, dass dein Controller zu viel macht und geteilt werden müsste. Bei Services (d.h. Klassen, welche die Datenobjekte bearbeiten) hingegen ist es kein Problem, wenn ein Controller auf mehrere davon zugreift.
 

Java20134

Bekanntes Mitglied
Ok, dass mit dem durchreichen kann man machen, aber ich finde es für den Codestyle schöner, wenn man so wenig Parameter wie möglich hat.

Außerdem habe ich nie gesagt, dass ich in einem Controller mehrere Models nutze. Ich weiß nicht, wie du gerade auf diese Idee kommst?
 

Saheeda

Top Contributor
Du schreibst, dass du durch das Hinzufügen der Klasse A (die so aus der Ferne nach nem Service klingt) ein weiteres Model hinzufügen müsstest. Das impliziert, dass die Beziehung zwischen dem momentanen Model und Model x eher schwach ist, da es ja ohne diese Klasse A dort nicht gebraucht wird. Könntest du ansonsten bitte ein Beispiel posten, was Klasse A macht und wie dein Controller aussieht? Es ist etwas mühselig mit hypothetischen Fällen zu arbeiten.



Edit: Ich bin in ca. ner Stunde daheim, dann kann ich dir zwei Möglichkeiten zeigen, wie man das Lösen kann. Vielleicht passt ja eine davon auf dein Problem.
 
Zuletzt bearbeitet:

Java20134

Bekanntes Mitglied
Ok, ich habe leider kein Codeschnipsel, da dieser Gedanke mehr theoretisch ist. Aber ich erläutere mein Beispiel einmal bisschen näher. Ich habe eine Klasse A, welche ein Model ist. In einem weiteren Model, welches in dem Zeitabschnitt deutlich weiter hinten kommt gestartet wird, wird eine Methode des Models A benötigt.

Nun war meine Frage wie ich mit gutem Style an diese Methode komme.
 

Tobse

Top Contributor
Was bedeutet denn "ein Model starten"??

Du übrgibts dem Model B eine Instanz von A, mit der es arbeiten soll. Entweder Händisch aus deinem Business-Code/Controller heraus, oder per DI. Oder wahlweise beides, je nach bedarf.
 

Java20134

Bekanntes Mitglied
Ich habe einmal zu dieser Theorie ein Beispiel geschrieben:
Java:
class A {

    private int parameters;

    public A(int parameters) {
        this.parameters = parameters;
    }

    public void method(){
        System.out.println("METHODE WURDE AUFGERUFEN");
    }
}

Und die Klasse B:
Java:
class B {

    private int p;

    public B(int p) {
        this.p = p;
    }

    public void method2(){
        //Aufruf der Methode method()
    }
}
Das Problem ist dabei sehr vereinfacht!

Zu Tobse ein Objekt zu starten habe ich als Synonym für instanziieren genommen.
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Da stellt sich jetzt die Frage, was method() macht - wenn es sinn macht, dass alle Objekte deiner Awendung die selbe Instanz von A benutzen bist du mit dem Singleton goldrichtig. Andernfalls - wie schon gesagt - DI.
 

Java20134

Bekanntes Mitglied
Diese Frage ist wie gesagt etwas theoretisch, da ich wissen wollte, ob es noch weitere schöne Möglichkeiten außer Singleton gibt.
Die Beispiele würde ich mir von Saheeda auch gerne einmal angucken!
 

Saheeda

Top Contributor
Sorry, hat etwas länger gedauert.

In meinem Beispiel geht es um eine Webseite, auf der sich User registrieren und Spiele "liken" können.
Repository = Klasse, die mit Datenbank arbeitet.

Nr. 1: Klassische Vererbung:

Code:
public abstract class BaseRepository<T extends Entity>{

    protected Connection connectToDatabase(){
        //
    }

    public abstract T save(T entity);
}

public class UserRepository extends BaseRepository<User>{

    @Override
    public User save(User user){
        Connection conn = connectToDatabase();
        return conn.save(user);            
    }
}

public class User extends Entity{}

Der Verbindungsaufbau zur Datenbank ist immer der gleiche, das kann ich mir zunutze machen, indem ich eine Basisklasse erstelle, die generische Methoden bereit stellt und diese dann in abgeleiteten Klassen konkretisiere.


Nr. 2: Kapselung und Methodenüberladung:

Code:
public class UserService{

    private SecurityRepository securityRepository;

    private UserRepository userRepository;

    private GameRepository gameRepository;

    public void save(User user, SecurityData securityData){
        //
    }

    public User update(User user, Game game){
        //
    }

    public User update(User oldData, User newData){
        //
    }
}

Mein UserService stellt Methoden bereit, die ich häufiger brauche und stellt gleichzeitig eine gewisse Kapselung dar, da es allein ihm überlassen bleibt, welche Repositories wie benutzt werden. Durch Methodenüberladung kann ich differenzieren, ob ich alle Daten aktualisieren muss (und damit alle Parameter brauche) oder nur einige.



Und so sehen bei mir üblicherweise Controller aus (wie gesagt, Webseite, kein JavaFX, aber Prinzip ist ähnlich).
Wie du siehst, wird das GameRepository(also das Ding, was auf die Spiele in der Datenbank zugreift) doppelt benutzt. Die Services und Repos selbst sind komplett zustandslos, deswegen tut es nicht weh, wenn davon mehrere Instanzen rumschwirren.

Code:
public class UserController{

    private GameRepository gameRepository;

    private UserRepository userRepository;

    private UserService userService;

    @RequestMapping(value = "/user/{id}/game/{gameId}", method = RequestMethod.POST)
    public ModelMap update(int id, int gameId){    

        User user =  this.userRepository.getOne(id);
        Game game = this.gameRepository.getOne(id);
        user = this.userService.update(user, game);
        return new ModelMap(user, "/user/show");
    }
}


public class GameController{

    private GameRepository gameRepository;

    @RequestMapping(value = "/games/{id}", method = RequestMethod.GET)
    public ModelMap getOne(int id){

        Game game = this.gameRepository.getOne(id);        
        return new ModelMap(game, "/games/show");
    }
}

Singleton ist dann sinnvoll, wenn deine Klasse A einen Zustand hat. Beispielsweise bei einem Taschenrechner ist es wichtig, dass sämtliche Klassen jedes Mal auf denselben Speicher zugreifen und somit mit denselben Daten arbeiten. Es wäre kompletter Humbug, wenn jede Klasse des Taschenrechners einen eigenen Speicher verwaltet.


Wenn ich mit dem User irgendwas mache, wird das Objekt vom Controller, über den Service bis hin zum Repository fast nur durchgereicht, ohne, dass es irgendwie "dreckig" wäre.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Bug: mehrfache Panels bei Mouseover? AWT, Swing, JavaFX & SWT 11
B Swing mehrfache Tabelleneinträge entfernen AWT, Swing, JavaFX & SWT 5
Hoppelmann Swing Mehrfache Pausen einer GUI AWT, Swing, JavaFX & SWT 3
S JavaFX Slider freezt nach Benutzung AWT, Swing, JavaFX & SWT 3
M JTextField gesperrt nach erster Benutzung... AWT, Swing, JavaFX & SWT 4
J NullPointerException bei Benutzung vom TableCellRenderer AWT, Swing, JavaFX & SWT 3
C AWT drawArc/ fillArc Problem mit Benutzung AWT, Swing, JavaFX & SWT 5
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
G JavaFX Verständnisfrage mit parametrisierten Methoden und FXML AWT, Swing, JavaFX & SWT 21
J Genutzte Methoden in einen Frame einbauen AWT, Swing, JavaFX & SWT 21
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
I JAVAFX - CSS - automatische Property- und Methoden-Vorlagen in Eclipse AWT, Swing, JavaFX & SWT 17
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
D JavaFX Java Methoden mit JavaFX Methode kommunizieren lassen? AWT, Swing, JavaFX & SWT 3
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
M Swing Vorgehen beim Aufruf der Klassen/Methoden AWT, Swing, JavaFX & SWT 7
L Rekursive Methoden -> Error: StackOverFlow AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
K Stundenplan, Kalender Methoden AWT, Swing, JavaFX & SWT 2
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
B Zu welchem Zeitpunkt sind Methoden anwendbar AWT, Swing, JavaFX & SWT 3
F JPanel mit zwei Methoden her beschreiben. AWT, Swing, JavaFX & SWT 8
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
F Initialisieren von Fenstern über Methoden AWT, Swing, JavaFX & SWT 3
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
M Alle Frame Methoden AWT, Swing, JavaFX & SWT 2
B Bedeutung der Methoden von Klasse WindowListener AWT, Swing, JavaFX & SWT 4
J eclipse/Visual Editor: Auf Felder/Methoden vom Hauptframe zugreifen AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
G Großbuchstaben abfragen mit Keycode Methoden AWT, Swing, JavaFX & SWT 5
A TreeNode abgeleitet -> Wie komme ich an meine Methoden? AWT, Swing, JavaFX & SWT 2
S Methoden implementieren AWT, Swing, JavaFX & SWT 7
P add Methoden bei Swing AWT, Swing, JavaFX & SWT 2
M Zugriff auf Methoden aus einem ActionListener AWT, Swing, JavaFX & SWT 2
B fire methoden auch bei defaultTableModel? AWT, Swing, JavaFX & SWT 5
G Probleme mit static Methoden in JFrame/JDialog AWT, Swing, JavaFX & SWT 7
G jcombo-box getters und setters methoden AWT, Swing, JavaFX & SWT 5
G Grafik auf mehrere Methoden/Klassen zerlegen AWT, Swing, JavaFX & SWT 2
J JTree/TreeModel add/delete Methoden AWT, Swing, JavaFX & SWT 2
S Methoden return wert? AWT, Swing, JavaFX & SWT 7
N JDK1.4- Überladen d. Methoden getValue setValue von JSpinner AWT, Swing, JavaFX & SWT 2
J instanceof von einem Interface und aufrufen der Methoden AWT, Swing, JavaFX & SWT 5
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
G ActionListener und Methoden-Aufruf aus anderen Klassen AWT, Swing, JavaFX & SWT 3
B ActionListener und Statische Methoden AWT, Swing, JavaFX & SWT 3
D Methoden zentral in einer Datei ablegen AWT, Swing, JavaFX & SWT 2
G zeitkontrollierte Methoden ??? AWT, Swing, JavaFX & SWT 6
M methoden.... AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben