Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Vererbungwerte von einem Objekt aus ein anderes übertragen
Hallo,
ich hab eine grundlegende Frage die ich nirgends beantwortet bekomme.
Ich habe eine Klasse in der sehr viele Variablen deklariert sind. Aus dieser klasse wird ein Objekt "aktuelle_werte" erzeugt, dieses wird ständig verändert und ausgelesen.
Zusätzlich habe ich noch zwei Objekte "min_werte" und "max_werte".
Nun vergleiche ich ständig die Aktuellen werte mit den min und maxwerten und schreibe diese bei neune Extremwerten in die jeweiligen min und maxwerte. Dies muss ich eh für jeden wert einzeln machen.
Wenn ich die werte aber wieder zurücksetzten will dachte ich, ich mach einfach "max_werte = aktuelle_werte" und "min_werte = aktuelle_werte". Leider biege ich hiermit den Zeiger um und ich habe keine einzelnen Objekte mehr.
Gibt es irgendeine Möglichkeit diese Werte in Summe zu übertragen oder muss ich das alles einzeln machen?
Ich hab schon was von clonen oder so gelesen, aber dann würde ich ja ständig zusätzliche Objekte generieren.
Wenn du eine Instanz der Klasse erzeugst, dann weist du ja den Attributen die Werte zu.
Wenn es so ist, dann empfehlt sich doch eine finale Variable des jeweiligen Typen und wenn du das Attribut wieder im Ursprung sehen willst, dann weise doch den Attribut die Variable nochmal zu.
So nach dem Motto:
Java:
public class Clazz{
private final int value = 100;
private int x;
public Clazz()
{
x = value;
}
public void resetX()
{
x = value;
}
}
Für solche generischen "über alle Felder/Methoden" Sachen eignet sich mMn Reflection ganz gut. Z.B. kannst du mit folgender Methode alle Feldwerte von src nach dst kopieren/übernehmen (falls du sonst keine weitere Qualifizierung der zu übernehmenden Felder benötigst):
Java:
public static <T> void copyValues(T src, T dst) {
Class<?> clazz = src.getClass();
for (java.lang.reflect.Field f : clazz.getDeclaredFields()) {
f.setAccessible(true);
try {
f.set(dst, f.get(src));
} catch (Exception e) {
throw new RuntimeException(
"Could not set field [" + f.getName() + "] from src=[" + src + "] to dst=[" + dst + "]");
}
}
}
Der obige Code funktioniert nicht für Klassenhierarchien. Aber da kannst du dich etwas in die Reflection API einlesen und schauen, wie das geht.
Für eine einzelne Klasse ist das vielleicht zu viel des Guten. Aber für solche Zwecke gibt es eine Reihe von Frameworks.
Hier ein Artikel, der mehrere davon vergleicht: https://www.frank-rahn.de/java-bean-mapper/
Klar, aber das alte Objekt wird vom Garbage Collector eingesammelt. Mach dir über solche Sachen keine Gedanken, außer du hast eine sicherheitskritische real-time Anwendung.
Klonen ist der way-to-go.
Bean Mapper sind meistens notwendig wenn man verschiedene Domain Beans (DB <-> BusinessLayer) mappen möchte.
Hallo,
Danke für die Hinweisse.
Ich hab mich jetzt trotzdem dazu entschieden die ca. 50 Werte einzen zu kopieren. Das ist für mich anfänger einfach übersichtlicher.
@rima
Ich denke, wenn du mehr von deinem Werk preisgeben würdest, würdest du auch bessere Ratschläge bekommen.
So richtig komme ich nicht drauf, was du da machst..