Ich habe bisher noch nicht wirklich mit Generic gearbeitet und benötige hier etwas Hilfe:
Ich habe folgendes Problem:
Ich habe eine Methode:
Java:
StringgenerateHtml(List<DocumentPosition> invoicePositions)...// Andere Methode aufrufen umd String zu generieren...String result =getTableBody(invoicePositions));
Hier die andere Methode
Java:
<T>StringgetTableBody(List<T> listValues)
Innerhalb der oberen Methode möchte ich nun eine andere Methode aufrufen, welches mir die Zahlen (von den verschiedenen Atttributen in listValues den Wert zurük gibt (Wert ist in double, aber ich benötige als Rückgabewert ein String):
String calculateAll(List<T> list);
Hier mein Versuch, aber ich komme hier nicht weiter, ob und wie ich dann wieder ein "DocumentPosition" Objekt bekomme? Der Cast funktioniert nicht, hier bekomme ich einen Compiler Fehler
Ja, das brauche ich dort dann natürlich nicht...
Ich müsste davor eben wieder prüfen, von welcher Klasse listValues stammt und dann wiederum in die entsprechende Berechnungsklasse gehen?
Also ich denke du solltest überlegen, wie du die Eigenschaften von der Listenelemente sinnvoll zusammenfassen kannst, und dann den generischen Parameter beschränken, also List<T extends XXX> mit XXX die passende Superklasse oder ein Interface.
Dann brauchst du aber auch Typsicherheit, also du kannst nicht casten wenn es bei der Hälfte der möglichen Parameter nicht funkioniert. Falls das nicht anders geht solltest du nicht alle möglichen Listen durch diese eine Methode jagen sondern klar beschränken.
Die Methode generateHtml sollte auch nicht die totalTaxValue berechnen. Das würde sauber strukturiert ausserhalb geschehen. Dann hättest du auch das Problem mit den Generics nicht.
Die Methode generateHtml sollte auch nicht die totalTaxValue berechnen. Das würde sauber strukturiert ausserhalb geschehen. Dann hättest du auch das Problem mit den Generics nicht.
Da hast du den Nagel auf den Kopf getroffen! Das gehört nicht in die Zuständigkeit dieser Methode. Es geht anscheinend um die Erstellung eines Rechnungsformulars oder in der Art.
Eine hypothetische Klasse könnte also so aussehen:
Und jede dieser Methoden bekommt die für ihre Arbeit erforderlichen Daten (in einem dafür passenden Datentyp, z.B. HeaderData, ListHeaderData, usw.) übergeben, wobei die Aufgabe jeweils nur ist, diese Daten in HTML einzubetten. Keine Berechnung.
EDIT: Oder es gibt sogar separate Klassen für jede dieser Aufgaben: HtmlHead, HtmlListHead, HtmlList, usw.
Ich habe verschiedene Tabellenarten:
- Postionstabelle (also dann später für Angebote, Rechnungen etc.)
- Mitarbeitertabelle (Eine Tabelle, die eine Übersicht liefert, welcher Mitarbeiter für ein Projekt geplant ist)
- usw....
Was meinst du genau mit übergeben? Welche Parameter sollten die Methoden haben: generateHead(); etc. ?
Insbesondere bei generateList() würde mich das interessieren.... Wie übergebe ich dann hier Positionen oder die Mitarbeiter, sodass das global gehalten wird und ich nicht String generateList(Position position, Employee employee....) übergebe?
Was bei mir ebenfalls noch in den Methoden passiert, dass ich die Platzhalter mit den richtigen Daten ersetze.
Was meinst du genau mit übergeben? Welche Parameter sollten die Methoden haben: generateHead(); etc. ?
Insbesondere bei generateList() würde mich das interessieren.... Wie übergebe ich dann hier Positionen oder die Mitarbeiter, sodass das global gehalten wird und ich nicht String generateList(Position position, Employee employee....) übergebe?
Ohne genauere Informationen ist das nicht so einfach zu sagen.
Für Head könnte man sich eine Klasse HeadData vorstellen
Java:
classHeadData{privateString titel;privateString subtitel;privateAdress adress;// .. was halt so in einem Kopf steht.}
Das Problem bei verschiedenen Tabellen ist ja, das auch die Spaltenanzahl und Spaltenbedeutung variabel sind. Du könntest dir also eine Klasse ListItem erstellen, aus der die Methode generateList() sich die benötigten Informationen herausholen kann, die sie braucht um einen entsprechende Liste zu generieren, also z.B. getCols() (Spaltenanzahl), getValue(int col) (Text in einer bestimmten Spalte). Das reicht eigentlich schon, um n Werte hintereinander in eine Zeile auszugeben.
public String generateList(List<ListItem> items) {}