Verschiedene Objekte in Abhängigkeit eines Typs instanziieren.

Bober

Mitglied
Hallo,


ich hab folgendes Konstrukt geschirben:
-Interface Calculation
-Abstrakte Klasse AbstractCalculation implements Calculation
- SubKlassen Calculation1, Calculation2,...

Nun habe ich in einer Methode ein Objekt vom Typ "Calculation", wobei ich in Abhängigkeit einer Int-Variable "typ" die Konstruktoren der SubKlassen aufrufen möchte.

Ist bisher über eine switch-Anweiseung gelöst:

Java:
		switch (typ) {

		case 1:
			calculation = new Calculation1();
			break;
		case 2:
			calculation = new Calculation2();
			break;
		default:
			System.err.println("now model or calculation with type number "
					+ typ + " was found");
			return;
}

Geht das auch einfacher bzw. schöner ohne Beschränkung der Anzahl durch die switch Anweisung. (muss immer erweitert werden, wenn eine neue Berechnung dazu kommt.)

Gruß,

Bober
 

Cromm Cruach

Mitglied
Könntest du nähere infos zu den Klassen / interfaces geben? Ich finde das Konstrukt Abstrakte Klasse Implements interface iwie komisch?! Weil entwerder nutzt man eigentlich ein Interface oder eine abstrakte Klasse?!
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Auf Basis des bisher gesagten, der Brot-und-Butter-OO-Vorschlag...
Java:
interface CalculationFactory
{
    Calculation create();
}

class CalculationFactoryOne implements CalculationFactory 
{
    @Override
    public Calculation create() { return new Calculation1(); }
}

void yourCode(CalculationFactory insteadOfSwitch)
{
    Calculation c = insteadOfSwitch.create();
}
 
S

SlaterB

Gast
und wie wird die Factory ausgewählt? ;)

wenn man nur einen Typ hat, ist die Alternative zu einem switch das Nachschauen in einer Map
map.get(typ).create()
wenn z.B. die zuvor genannte Factory jeweils eingetragen ist, das können die einzelnen Klassen machen,
falls sie dran kommen und Zugriff auf die Map haben
 

Marco13

Top Contributor
Ja, war nur ein first shot. Vermutlich wird jemand parallel zu diesem Beitrag den ich gerad schreiben auch vorschlagen, ein Dependency Injection Framework zu verwenden :D
 

Bober

Mitglied
Also hier einige weitere Infos:

Ich möchte mit dem Konstrukt ermöglichen, dass weitere Calculations entweder durch erben der Abstrakten Klasse oder durch implementieren des Interfaces hinzugefügt werden können.


Ich will also in einer freie Sprache formuliert folgendes realisieren:

Calculation c;

c = new Calculation*();

Wobei für * der wert der variable typ eingesetzt werden soll, also den Klassennamen ändert.
 
T

Tomate_Salat

Gast
Wäre so z.B. möglich:
[c]Class.forName("mein.pakat.Calculation" + meineVariable).newInstance()[/c]

Wobei ich mir eher eine Factory bauen würde.
 
M

maki

Gast
Keine Ahung ob ich den TS richtig verstehe, aber ohne DI würde ich das wohl mit dem Strategy Patttern als Enum umsetzen:
Java:
public enum Calculate{
	ADD {
		public double calculate(double first, double second) {
			return first + second;
		}
	},
	MULTIPLY {
		public double calculate(double first, double second) {
			return first + second;
		}		
	},
..	
	public abstract double calculate(double first, double second);
}

...

Calculate calc = Calculate.ADD;
double result = calc.calculate(1,2);
 

Bober

Mitglied
Ok, das mit der Factory habe ich wohl verstanden. jedoch lagert das doch bei mir lediglich das Problem in eine andere Klasse aus, bei der ich dann wiederum mittels switch oder if anweisungen die einzelnen Klassennamen einem Typ zuweisen muss, oder habe ich da was übersehen?
 
T

Tomate_Salat

Gast
Du könntest es in komination mit marcos und slaters vorschlag machen (was ähnlichkeiten zu meinem Class.forName hat):
Java:
public class CalculatorFactory {
     private static Map<String,Calculator> operations=new HashMap<>();

     public static Calculator getInstance(String identifier) {
           return operations.get(identifier);
     }

     public static boolean registerOperation(String identifier, Calculator calc) {
          if(operations.containsKey(identifier)) return false; // Überschreiben verhindern
          operations.put(identifier,calc);
          return true;
     }
}

Fehler im Code sind möglich, da ichs gerade im Forum runtergetippt habe und nicht in einer IDE. Aber so in etwa hast du eine flexible Factory.

Ach ja:
Abrufen könntest du es dann so:
Java:
Calculator addition=CalculatorFactory.getInstance("add");
 
Zuletzt bearbeitet von einem Moderator:

Cromm Cruach

Mitglied
Ich verstehe nicht soganz warum du den Klassennamen dynamisch haben willst?! Anscheinend machen die Objekte alle das gleiche?! Wäre ist nich einfacher ein Calcualionobjekt zu machen demm du ne Option übergibst was du berechnen willst?!
 

Bober

Mitglied
Die Objekte machen alle komplett unterschiedliche Berechnungen, sie bekommen lediglich alle die Parameter als String Array und setzen die Ergebnisse in einem String Array. Berechnungen werden durch die Methode "calculate()", die das Interface vorschreibt, durchgeführt.


Zurück zum Thema:


Was ist eigentlich an der "Class.forName("mein.pakat.Calculation" + meineVariable).newInstance()"
Methode schlecht, bzw was an der Map bzw der Factory besser?
 
D

dhalsim

Gast
Was ist eigentlich an der "Class.forName("mein.pakat.Calculation" + meineVariable).newInstance()"
Methode schlecht, bzw was an der Map bzw der Factory besser?
Die genannte Factory-Lösung bringt schon einige Vorteile:
  1. Typsicherheit: Die Factory gibt dir bereits Calculator-Instanzen zurück. Class.newInstance() hingegen nur ein Object, welches ein Calculator oder aber mit etwas Pech auch was ganz anderes sein kann.
  2. Fehlerhandling: Die Behandlung und eventuelle Weitergabe/Generierung von Fehlern lässt sich in der Factory schön festlegen, während du bei Class.newInstance() das jedes mal im aufrufenden Code machen musst, und du an der Art und Weise, wie sich Class.newInstance() verhält, auch nicht mehr viel ändern kannst.
  3. Durchsetzung der Singleton-Semantik: Die Factory gibt dir für eine ID jedes mal die gleiche Instanz zurück. Mit Class.newInstance() hingegen erzeugst du jedes mal eine neue Instanz, obwohl das bei solchen zustandslosen Objekten gar nicht notwendig ist.
  4. Erweiterbare Registrierung: Die Factory dient auch als Registry für Calculator-Instanzen. Das heißt, dass du sie z.B. einfach fragen könntest, welche Calculator überhaupt existieren.
  5. Frei wählbare IDs: Class.forName() übergibst du einen vollqualifizierten Klassennamen. Damit bist du sehr abhängig von Implementierungsdetails wie Packages und Klassennamen. Bei der Factory-Lösung können die IDs hingegen frei wählbar sein. Sie lassen sich somit viel besser menschenlesbar und merkbar gestalten und verlieren nicht gleich beim nächsten Refactoring ihre Gültigkeit.
All das macht die Factory um einiges einfacher und angenehmer zu benutzen.
 
Zuletzt bearbeitet von einem Moderator:

Marco13

Top Contributor
@Tomate_Salat (und teilweise dhalsim) : Ich finde, durch diese Map wird da einiges "kauptt" gemacht. Es ist dann keine Factory mehr, sondern einfach eine statisch-globale Map, und das ist IMHO erstmal unschön. Vielleicht ist "sowas" hier passend, dazu müßte man das Problem genauer kennen, aber ... man sollte das NICHT mehr "Factory" nennen :noe:
 
D

dhalsim

Gast
Danke für den Hinweis, du hast natürlich recht. Wenn man sich das Beispiel noch mal in Ruhe anschaut, ist diese vermeintliche Factory von außen auch nichts weiter als eine Map. Man braucht dazu bloß die Methodennamen ersetzen
  • getInstance(id) durch get(id)
  • registerOperation(id, calculator) durch put(id, calculator)
und schon sieht man das deutlich. Ich würde das Ganze daher eher als "Registry" bezeichnen.

Was man allerdings machen kann ist das Ganze wiefolgt zu ändern (zur Vereinfachung mal nicht-statisch als Interface):
Java:
interface CalculatorRegistry {

    void register(String id, Class<? extends Calculator> clazz);

    Calculator getCalculator(String id);

}
Dann hätte das tatsächlich einen Factory-Anteil, da sich auch um die Erzeugung gekümmert wird.
 

Marco13

Top Contributor
Hmja, und wenn man das noch ein bißchen weiter ausbaut, ist man wirklich bei einem Dependency-Injection-Framework ;) Irgendwo muss die Entscheidung getroffen werden: Beim ersten dort, wo der int 'typ' einen Wert erhielt, bei der Factor dort, wo die Factory instantiiert wird, bei den Registry-Varianten dort, wo die passende Value zum passenden Key reingelegt wird, und bei DI auf noch höherer oder abstrakterer Ebene - aber zumindest sieht man, dass es viele Möglichkeiten gibt, das nach 1980 aussehende unflexible "switch" wegzubekommen ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
C Verschiedene Versionen mit Datenbanken Allgemeine Java-Themen 3
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
M verschiedene Dokumente auslesen Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
H Klassen LibGDX - Verschiedene Klassen als Value in einer Map Allgemeine Java-Themen 8
K Verschiedene Sprachen Allgemeine Java-Themen 1
C -Verschiedene Versionen eines Programms verwalten Allgemeine Java-Themen 7
M Verschiedene Pilzartenerkennung Allgemeine Java-Themen 0
I Verschiedene Arrays auslesen Allgemeine Java-Themen 6
nrg Verschiedene JREs im Browser konfigurieren Allgemeine Java-Themen 6
S Best Practice verschiedene Exceptions fangen und neue Exception erzeugen Allgemeine Java-Themen 11
G DesignPattern Verschiedene Services Allgemeine Java-Themen 4
M massenhaft verschiedene Date-Pattern Allgemeine Java-Themen 3
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
faetzminator verschiedene Beans, verschiedene Felder "koppeln" Allgemeine Java-Themen 3
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
S Welche Datenstruktur für verschiedene Sprachen sinnvoll? Allgemeine Java-Themen 2
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
M verschiedene Methonden innerhalb des gleichen Threads Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
S Package in verschiedene Projekten einbinden? Allgemeine Java-Themen 3
D Verschiedene Datein aus einer Zip Datei ins Programm laden Allgemeine Java-Themen 4
D Verschiedene Persistenz Strategien Allgemeine Java-Themen 7
S Konstruktoren, verschiedene Klassen, Methoden. Allgemeine Java-Themen 3
M Verschiedene Modi bei AbstractTableModel Allgemeine Java-Themen 10
J Verschiedene Klassen, verschiedene Ströme? Allgemeine Java-Themen 6
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
L Verschiedene Versionen eines Interfaces Allgemeine Java-Themen 12
J Verschiedene Starteinstellungen Allgemeine Java-Themen 7
J Programm für verschiedene Betriebssystem vertreiben? Allgemeine Java-Themen 10
M 2 verschiedene LookAndFeels in einem Fenster möglich? Allgemeine Java-Themen 6
D Gehts praktischer? Thema:Verschiedene Instanzen einer Klasse Allgemeine Java-Themen 3
C Verschiedene JDKs Allgemeine Java-Themen 6
M Regular Expression - verschiedene Ausdrücke testen (grep | ) Allgemeine Java-Themen 5
C verschiedene Klassenarten Allgemeine Java-Themen 3
G Verschiedene Auflösungen Allgemeine Java-Themen 6
H verschiedene Java Versionen Allgemeine Java-Themen 3
A Textfeld soll verschiedene Datumseingaben akzeptieren Allgemeine Java-Themen 5
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben