Java-generische Methode
Habe ich eine ganze Reihe von Klassen, die diese definieren zwei Konstanten, z.B.:
public class Face
{
public static final int LUMP_INDEX = 1;
public static final int SIZE = 20;
blah blah
}
public class Edge
{
public static final int LUMP_INDEX = 5;
public static final int SIZE = 32;
blah blah
}
etc.
Im moment habe ich eine Funktion für jeden einzelnen zu erstellen, die ein array dieser Klasse, mit der 2 Konstanten in der Klasse definiert.
private Face[] createFaces(RandomAccessFile in)
{
int numFaces = doSomeCalculations(Face.LUMP_INDEX, Face.SIZE);
Face[] faces = new Face[numPlanes];
blahblah;
for(int i = 0; i < numFaces; i++)
faces[i] = new Face();
return faces;
}
Etwas albern, müssen Sie eine Funktion erstellen, die für jede Klasse. Das einzige was sich ändert ist die Klasse type. Also ich wollte einen genertic Methode, die funktionieren würde, mit keiner der Klassen, die oben. So etwas wie:
private T[] create(RandomAccessFile in, Class T)
{
int num = doSomeCalculations(T.LUMP_INDEX, T.SIZE);
T[] faces = new T[numPlanes];
blahblah;
for(int i = 0; i < num; i++)
faces[i] = new T();
return faces;
}
Aber ich bin mir nicht sicher, wie man es richtig machen. Jede Hilfe würde geschätzt werden. Danke.
Wie Borgwardt erklärt, obwohl die zu Lesen, anstatt Felder mit reflection können Sie definieren eine Schnittstelle mit zwei
aber dann müssten Sie eine Instanz der Klasse, um die Methoden aufzurufen, da Sie sich nicht statisch sein, und ein Teil der Klasse object.
genau, ich meinte als möglichen Schritt zur Umgestaltung des Codes. Vielleicht durch erstellen eines neuen
get
Methoden.aber dann müssten Sie eine Instanz der Klasse, um die Methoden aufzurufen, da Sie sich nicht statisch sein, und ein Teil der Klasse object.
genau, ich meinte als möglichen Schritt zur Umgestaltung des Codes. Vielleicht durch erstellen eines neuen
T
ersten, dann mit t.setNumPlaces(n)
. Oder speichern Sie die Konfiguration auch anderswo, z.B. UtilClass.getLumpIndex(Faces.class)
.
InformationsquelleAutor terryhau | 2011-03-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur so gemacht werden könnte, dass auf der Arbeit ist es, mithilfe von reflektion zu Lesen, die Konstanten durch das class-Objekt und
Array.newInstance()
, um das array erstellen. Oh, und die Signatur der Methode müsste so Aussehen:Bearbeiten
Eine alternative Lösung wäre, halten Sie Konstanten, die in eine Karte eingegeben, die durch die Klasse und nicht als statische Felder. Java ist einfach nicht dynamisch genug, vor allem auf der Klassenebene, es zu tun Ihren Weg sauber.
Sie können clazz.newInstance(), aber nur, wenn alle Klassen haben parameterlosen Konstruktoren.
Die Förderung der Reflexion in Situationen wie dieser, ist absolut unverantwortlich. Schande über Sie.
Förderung der Nutzung von design patterns als eine silberne Kugel in Situationen, wo Sie nicht zu verbessern, alles andere ist auch nicht besser.
InformationsquelleAutor Michael Borgwardt
Es gibt keine Entschuldigung für die Verwendung der Reflexion in einer situation wie dieser. Bung in eine Abstrakte Fabrik oder ähnliches.
Finden Sie die GoF-Buch (Gang of Four, "Design Patterns").
Danke. Wenn ich das Verständnis der Abstract Factory design pattern korrekt, ich würde ein Factory-interface, und ich würde eine konkrete factory für jedes meiner Klasse Typen, den ich erschaffe. So ist jedes konkrete Werk geht, um eine Funktion erstellen, die Kopie eingefügt, und ich am Ende mit dem gleichen problem? Oder bin ich nicht immer die design-Muster.
du hast Recht, eine abstrakte Fabrik wäre theoretisch sauberer, aber würde wahrscheinlich dazu führen, selbst schlechter code-Duplizierung in der Praxis.
Sobald Sie haben es in der abstrakten factory-Formular oder ähnliches, es ist einfach ein Faktor aus den gemeinsamen code.
InformationsquelleAutor Tom Hawtin - tackline
Potenziell Sie könnten dies tun, indem beide (alle?) die Elemente, die Sie erstellen möchten, erweitern einige Oberklasse "Array-Objekt in der Lage"
Aber dein "blablabla" in createFaces ist nicht das gleiche, Sie gewinnen nichts und wieder dich selbst in eine Ecke mit der Erweiterung.
Ich würde schauen, ob oder nicht Sie wirklich brauchen, diese verschiedenen Klassen, die alle das gleiche tun, oder ob es einige Allgemeine beheben Sie Aussehen könnte. Wenn der einzige Unterschied zwischen den beiden ist Ihre statische Variablen, zum Beispiel -, dann sollten Sie verschieben Sie diese an einen Ort, sagen wir - eine Ressource-Datei.
Wenn Sie alle haben die gleichen, allerdings sind diese "array erstellen" Abschnitte dieses code, dann trennen oder irgendwie verknüpfen Sie unnötig scheint am besten.
InformationsquelleAutor Dave C
Können Sie immer die einfachere form:
Und verwenden Sie es wie
Es ist weder so Professionell wie mit einem abstrakten Werk noch als dumm (und gefährlich!) die gleiche Funktion immer und immer wieder. Sie können immer noch den Fehler machen, den Aufruf mit
Aber das ist ein Fehler, es ist einfach zu zeigen.
Zum instanziieren eines Elements: clazz.newInstance(). Erstellen Sie ein array ist komplexer, man braucht so etwas wie
T[] a = (T[]) Array.newInstance(clazz, size);
Da der cast auf (T[]) ist unsicher, Sie brauchen, um eine Anmerkung wie@SuppressWarnings("unchecked")
über Ihre MethodeInformationsquelleAutor Pablo Grisafi