Objekte automatisch casten

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hey,

ich bin gerade dabei einen generischen Comparator zu basteln, den ich in meiner gesamten Anwendung verwenden möchte. Nun stellt sich das Problem, dass natürlich je nach Ergebnisliste unterschiedliche Objekttypen zum Vergleich vorliegen. Hier mal ein kurzer Auszug:

Code:
        Comparator comparator = new Comparator() 
        {
            public int compare(Object o1, Object o2) {
            	Testobjekt c1 = (Testobjekt) o1;
            	Testobjekt c2 = (Testobjekt) o2;
                if (sortColumnName == null) {
                    return 0;
                }
                if (sortColumnName.equals("acb")) {
                    return ascending ?
                            Integer.valueOf(c1.getModuleNumber()).compareTo(Integer.valueOf(c2.getModuleNumber())) :
                            Integer.valueOf(c2.getModuleNumber()).compareTo(Integer.valueOf(c1.getModuleNumber()));
                } else return 0;
            }
        };

Derzeit wird ein Obekt der Klasse Testobjekt übergeben und je nach "sortColumnName" wird entsprechend sortiert. Nach dem "Umbau" soll jedes beliebige Objekt abgehandelt werden können. Die Variable "sortColumnName" soll dann per Reflection die getter-Methode (in diesem Fall getModuleNumber()) ersetzen. Leider weiß ich nicht so recht wie ich das automatische Casten direkt zu Beginn umsetzen soll.
 

Der Müde Joe

Top Contributor
meinst du sowas:
Code:
Comparator<String> com = new Comparator<String>() {
	public int compare(String s, String t){
		return 0;
	}
};
 
G

Guest

Gast
Ne, nicht wirklich. Der Comparator bekommt ja nicht Objekte der Standard-Datentypen übergeben sondern Objekte selbst erstellter Klassen mit gettern und settern.
 
G

Guest

Gast
Dann verstehe ich eure Antworten irgendwie nicht bzw. falsch.
 

manuche

Bekanntes Mitglied
Ein String wird in Java nicht als primitiver Datentyp gehandhabt, sondern als ein Objekt der Klasse String...
 

Marco13

Top Contributor
Anonymous hat gesagt.:
Dann verstehe ich eure Antworten irgendwie nicht bzw. falsch.

So ein Zufall. Genauso geht's uns mit deiner Frage :lol:

Vielleicht meinst du das ja so: Du willst einen Comparator, der zwei Objekte beliebigen Typs bekommt. Auf Basis einer von außen festgelegten Regel sollen diese Objekte verglichen werden. Unklar ist, wie "flexibel" das ganze sein soll, und auf was das ganze angewendet werden soll. Ein Beispiel:
Code:
class SomeType
{
    public int getSomeValue() { .... }
}

// Ein Comparator, der zwei beliebige Objekte vergleicht, indem
// er sich den Wert holt, der von der Methode "getSomeValue"
// zurückgeliefert wird
Comparator comparator = new GeneralComparator("getSomeValue");
Mit diesem Comparator könnte man dann zwei "SomeType"-Objekte vergleichen - abhängig davon, was ihre "getSomeValue"-Methoden zurückliefern.

Die compare-Methode müßte da dann SINNGEMÄSS!!! so implementiert sein:
Code:
class GeneralComparator
{
    private String methodName = ...  //  in diesem Fall "getSomeValue"

    public int compare(Object o1, Object o2) 
    { 
        Method m = o1.getClass().getMethod(methodName, ...);
        Object value1 = m.invoke(o1, ...);
        Object value2 = m.invoke(o2, ...);
        // Wenn man davon ausgehen kann, dass die 
        // zurückgegebenen Werte Comparable sind
        // (d.h. z.B. Integer oder String)
        Comparable c1 = (Comparable)value1;
        Comparable c2 = (Comparable)value2;
        return c1.compareTo(c2);
    }
}

Ein paar Fragen blieben dann noch offen, aber vielleicht kannst du sie dann entweder uns oder dir selbst beantworten :wink:
 

Campino

Top Contributor
Mit diesem Comparator könnte man dann zwei "SomeType"-Objekte vergleichen - abhängig davon, was ihre "getSomeValue"-Methoden zurückliefern.
Müsste es nicht sogar möglich sein, zwei Objekte beliebigen Types zu vergleichen, solange sie nur "getSomeValue" implementieren?

Alles in allem halte ich das für zu aufwändig. Mehrere eigene Comparatoren (für jeden Objekttyp einen) zu schreiben, müsste performancemäßig besser klappen als das über Reflections zu lösen.
Notfalls nimmst du halt ein Interface, dass eine Methode compareTo(Object o) oder eine Methode getCompareValue() vorraussetzt und schreibst den Comparator für das Interface.
 

Marco13

Top Contributor
Campino hat gesagt.:
Mit diesem Comparator könnte man dann zwei "SomeType"-Objekte vergleichen - abhängig davon, was ihre "getSomeValue"-Methoden zurückliefern.
Müsste es nicht sogar möglich sein, zwei Objekte beliebigen Types zu vergleichen, solange sie nur "getSomeValue" implementieren?
Ja. Hätte man vielleicht nochmal hervorheben sollen.


Alles in allem halte ich das für zu aufwändig. Mehrere eigene Comparatoren (für jeden Objekttyp einen) zu schreiben, müsste performancemäßig besser klappen als das über Reflections zu lösen.

Es geht (falls ich das richtig verstanden habe) ja nicht um einen Objekttyp (sonst wäre die erste Antwort ja schon die Lösung gewesen) sondern darum, einen Comparator zu schreiben, der "dynamsich" auf Basis des Ergebnisses einer beliebigen Methode vergleicht. Bei
Code:
class SomeType
{
    public int getSomeValue() { .... }
    public int getSomeOtherValue() { .... }
}
könnte man dann zwar auch
Comparator someTypeBySomeValueComrator = ...
Comparator someTypeBySomeOtherValueComrator = ...
erstellen, aber bei vielen Methoden könnte das auch aufwändig werden - es KÖNNTE Situationen geben, wo die reflection-Lösung die elegantere ist.

EDIT: ... insbesondere (und in Anlehnung an deine oben zitierte Aussage) könnte man ja Objekte verschiedener Klassen vergleichen, wenn sie die gleiche Methode haben .... und für sowas hätte man mit dedizierten Implementierungen wie
Comparator someTypeBySomeValueComrator = ...
Comparator someTypeBySomeOtherValueComrator = ...
Comparator someTypeAndSomeOtherTypeBySomeValueComrator = ...
Comparator someTypeAndSomeOtherTypeBySomeValueOtherComrator = ...
Comparator someTypeAndYetSomeCompletelyDifferentTypeBySomeValueComrator = ...
Comparator someTypeAndYetSomeCompletelyDifferentTypeBySomeOtherValueComrator = ...
eben eine "kombinatorische Explosion" - aber ich geb zu: Das wirkt schon arg konstruiert :roll:
 
G

Guest

Gast
Ok, ich versuche mal ein wenig Licht ins Dunkel zu bringen und meine Anforderung ein wenig detaillierter zu berschreiben. Ich brauche die Methode um in einer Webanwendung Ergebnislisten zu sortieren, indem man auf die jeweilige Spaltenüberschrift klickt. Man hat also zum Beispiel eine Liste "Kunden" und kann dann nach Vorname, Name, Straße, PLZ, etc. sortieren. Da es extrem viele solcher Ergebnislisten gibt wäre es sehr aufwendig für jede Liste eine eigene Methode zu implementieren.

Folgende POJOs stehen beispielsweise zur Verfügung:

Code:
public class Kunde
{
private String name;
private String vorname;
private String strasse;
private String ort;

.......

//getter und setter für alle private Variablen
}


public class Artikel
{
private String artikelnummer;
private String beschreibung;
private String preis;

.......

//getter und setter für alle private Variablen
}


Klickt der Anwender nun in einer Ergebnisliste auf eine Spaltenüberschrift erhalte ich folgendes zurück:

Code:
ArrayList<Kunde> liste; // oder ArrayList<Artikel> liste;
String spaltenname;

Und genau diese Informationen möchte ich an den Comparator übergeben. Eine Liste mit belibigem Inhalt und einen Spaltennamen. Er soll also die Liste nach dem Wert sortieren, den er über getSpaltenName aus dem Objekt bekommt.
 
G

Gast

Gast
reflection ist bei weitem nicht mehr so lahm, wie vor einigen jahren, aber ich würd meinen zeilenobjekten wahrscheinlich trotzdem einfach paar methoden spendieren, um metainformationen zu erhalten. z.b. mit einem interface dieser art:

Code:
interface TableRow
{
   int numFields();
   String getField( int index );
   int findField( String name );
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
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
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
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
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
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
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
J Eindeutige ID für Objekte als Keys in TreeMap Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben