Liste aller implementierenden Klassen einer Oberklasse anzeigen

kirdie

Bekanntes Mitglied
Ich habe eine Menge von Methoden, die in eine Klasse gekapselt sind, denn man kann ja in Java keine Funktionen als Parameter nehmen.
Jetzt möchte ich den Benutzer aber auswählen lassen, welche Methode er nehmen will. Allerdings möchte ich das nicht hardcoden, da ja später Methoden dazukommen könnten.
Hier mal ein einfaches Beispiel:

Java:
public interface Algorithm
{
 public static String getDescription();
 public int exec(int param1, int param2);
}

public class Addition implements Algorithm
{
@Override
public static String getDescription() {return "Addition";}
@Override
 public int exec(int param1, int param2) {return param1+param2;}
}
Jetzt soll der Benutzer angezeigt bekommen, welche Methoden es alles gibt, und zwar ungefähr so (pseudocode):

Java:
System.out.println("Which algorithm do you want to use?");
for(Class<Algorithm> algorithmClass: implementingClassesOf(Algorithm) )
{
 System.out.println(algorithmClass.getDescription());
 boolean useThis = input.nextBoolean();
 if(useThis)
 {
  new algorithmClass().exec(param1, param2);
 }
}

Problem dabei ist jetzt erstens, dass es sowas wie "implementingClassesOf" nicht gibt und zweitens, dass man keine statischen Methoden von Klassen aufrufen kann. Das finde ich jedoch unlogisch. Wenn ich String.valueOf() mache, brauche ich ja kein Objekt, sondern nur eine Klasse und "String" ist ja eine Klasse. Deshalb müsste doch "String.getClass()" eigentlich das gleiche sein, wie "String", aber da es das nicht ist, kann mir jemand erklären, warum?

Alternative:
Um das zu umgehen, habe ich mir folgendes überlegt:

Java:
public class Algorithms()
{
 public static final Algorithm[] algorithms = {new Addition(), new Subtraktion()};
}

Jetzt könnte man folgendes schreiben:

Java:
System.out.println("Which algorithm do you want to use?");
for(Algorithm algorithm: Algorithms.algorithms )
{
 System.out.println(algorithm.getDescription());
 boolean useThis = input.nextBoolean();
 if(useThis)
 {
  algorithm.exec(param1, param2);
 }
}

Das hat jedoch folgende Nachteile:

- man braucht eine zusätzliche Klasse (hier "Algorithms")
- dort müssen die Klassen manuell eingetragen werden, also jedesmal ein Eintrag hinzugefügt werden, wenn eine neue Unterklasse dazu kommt
- es wird eine statische Methode von einem Objekt aufgerufen, durch Vererbung kann da also auch die falsche aufgerufen werden
- es kann ein Overhead durch Konstruktorinitialisierung entstehen. Nehmen wir an, es dauert 1 Minute die Klasse "HyperdimensionaleAddition" zu initialisieren, wobei gar nicht garantiert ist, dass diese auch benutzt wird
- bei jedem Aufruf eines Algorithmus kann ein neues Ergebnis herauskommen, wenn durch die vorhergehenden Aufrufe Felder der Instanz modifiziert wurden
- der Algorithmus kann in einen ungültigen Zustand kommen und nicht mehr funktionieren, dann kann die Methode nicht mehr aufgerufen werden (das würde umgangen werden, wenn jedes mal eine neue Instanz erzeugt wird)

Die letzten beiden Punkte kann man natürlich durch sorgfältige Programmierung vermeiden. Das Argument des Overheads kann auch gegen eine Neuinitialisierung verwendet werden, weil dann zwar nicht alle möglichen Algorithmen im vorraus initialisiert werden würden, aber dafür ein Algorithmus mehrmals initialisiert wird. Das Problem mit der statischen Methode kann man beheben, indem man sie einfach nicht statisch macht.

Trotzdem bin ich mir noch nicht sicher, ob diese Alternative das Beste in dieser Situation ist und würde deshalb gerne wissen, was denn das Standardverfahren für diese Art Problem ist.
 
S

SlaterB

Gast
eine Enum ist eine schöne abgeschlossene Angelegenheit:
automatisch vorhandene Aufzählung + keine Möglichkeit zur Vererbung/ weitere Algorithmen

ein Class-Objekt ist etwas mit einer bestimmten Funktion, Auflistung der Methoden usw., hat nicht die Aufgabe dasselbe zu sein wie die Klasse hinsichtlich Aufruf statischer Methoden,
bei einem ganz allgemeinen Class-Objekt wäre das auch gar nicht möglich, das hat ja nichts mit einer bestimmten Klasse zu tun,

nur im begrenzten Gebiet der erst ab Java 1.5 hinzugekommenen Generics mit Class<Algorithm> und ähnlichem könnte man sich da etwas denken,
aber es gilt der Grundsatz: Objektorientierung, Vererbung, Interface usw. sind für Objekte gedacht, nicht für Klassen,
du brauchst nichts statisches, alles sinnvolle läßt sich auch ohne static implementieren,

wenn dich der Aufwand der Objekterzeugung stört, dann lege einmalig in einer Map Objekte an und verwende diese immer wieder,
was wieder zur Enum zurückführt -> jeder Enumwert ist ein Objekt der Klasse

> bei jedem Aufruf eines Algorithmus kann ein neues Ergebnis herauskommen, wenn durch die vorhergehenden Aufrufe Felder der Instanz modifiziert wurden
dann verwende eben keine Felder in den Algorithmus-Klassen.., das Problem gilt für statische Methoden genauso, wenn statische Felder modifiziert werden
 

XHelp

Top Contributor
Die initialisierung von Operationen sollte eigentlich nichts machen. Da wird ja nichts berechnet. In Interfaces kannst du auch keine statischen Methoden angeben.
Hier mal auf die schnelle zussamen geschriebenes Beispiel, wie es laufen könnte, wobei manche Sachen definitiv zu verbesser sind, manche man auslagern könnte etc. Es geht eben nur um einen Gedankenanstoß
Java:
public interface Algorithm {
	public String getDescription();
	public Integer exec();
	public int getParameterCount();
	public void setParameter(int number, Integer value);
}
Java:
public class Addition implements Algorithm {
	int a = 0;
	int b = 0;

	@Override
	public String getDescription() {
		return "Addition";
	}

	@Override
	public Integer exec() {
		return a + b;
	}

	@Override
	public int getParameterCount() {
		return 2;
	}

	@Override
	public void setParameter(int number, Integer value) {
		if (getParameterCount() < number) {
			throw new IllegalArgumentException("Parameter existiert nicht");
		}
		switch (number) {
		case 0:
			a = value;
			break;

		case 1:

			b = value;
			break;
		}
	}

}
Java:
public class Square implements Algorithm {
	private Integer x;

	@Override
	public String getDescription() {
		return "Square";
	}

	@Override
	public Integer exec() {
		return x * x;
	}

	@Override
	public int getParameterCount() {
		return 1;
	}

	@Override
	public void setParameter(int number, Integer value) {
		if (getParameterCount() < number) {
			throw new IllegalArgumentException("Parameter existiert nicht");
		}
		x = value; 

	}
}
Java:
public class AlgoUtility {
	private static List<Class<? extends Algorithm>> algoList=null;
	static {
		algoList = new ArrayList<Class<? extends Algorithm>>();
		algoList.add(Addition.class);
		algoList.add(Square.class);
	}
	public static List<Class<? extends Algorithm>> getAlgorithmList() {
		return algoList;
	}
}
Java:
public class MainTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		for (Class<? extends Algorithm> currentAlgoClass:AlgoUtility.getAlgorithmList()) {
			try {
				Constructor c =  currentAlgoClass.getConstructor(null);
				Algorithm  currentAlgo = (Algorithm) c.newInstance(null);
				System.out.println("Algo '"+currentAlgo.getDescription()+"' benutzen?");
				if (sc.nextBoolean()) {
					for (int i=0;i<currentAlgo.getParameterCount();i++) {
						System.out.println("Parameter "+(i+1)+" eingeben:");
						Integer tmp = sc.nextInt();
						currentAlgo.setParameter(i, tmp);
					}
					System.out.println("Das Ergebnis ist: "+currentAlgo.exec());
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

Aber wie gesagt, eher ein Gedankenanstoß
 

kirdie

Bekanntes Mitglied
Vielen Dank für das ausführliche Beispiel XHelp! Ich werde es zwar jetzt doch nur mit Instanzen machen, da das in meinem Fall reicht aber falls ich mal die volle Funktionalität davon brauche werde ich das auf jeden Fall benutzen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
S AWT Wie bekomme ich eine Liste aller chars in einem Font? Allgemeine Java-Themen 3
I Liste aller bekannten Packages Allgemeine Java-Themen 6
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
pg1337 Liste füllen Allgemeine Java-Themen 2
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
B Properties File Liste Allgemeine Java-Themen 3
Gossi Collections Liste zusammenfassen für JSP Allgemeine Java-Themen 4
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
C Exponentielle Verteilung in einer Liste Allgemeine Java-Themen 7
Nic.o liste der installierten Zertifikate ?! Allgemeine Java-Themen 3
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Verständnisfragen bezüglich Liste Allgemeine Java-Themen 3
J Zeichenketten-Liste filtern Allgemeine Java-Themen 6
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
reibi Kopie einer Liste Allgemeine Java-Themen 4
N Liste mit Map abgleichen extrem langsam Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Liste sortieren Allgemeine Java-Themen 6
L Objekte in Liste packen Allgemeine Java-Themen 2
N Liste aendern waehrend des iterierens ueber selbige Allgemeine Java-Themen 11
B Datenstruktur: Liste Allgemeine Java-Themen 5
S Liste mit verschiedenden Objekten Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben