In Java können Sie schreiben:Entspricht „Abc.class.getName()“ für Felder
System.out.println(Abc.class.getName());
Es wird immer den richtigen Wert drucken, auch wenn die Klasse Abc verschoben oder umbenannt wird.
Was ist für Feldnamen am nächsten?
Mit anderen Worten, was kann ich Code, der mir immer den "aktuellen" Namen eines Feldes in einer Klasse geben wird, auch wenn dieses Feld umbenannt wird. Im Idealfall würde es auch nicht kompilieren, wenn das Feld vollständig entfernt wird. Oder zumindest fehlgeschlagen, sobald auf die Klasse zugegriffen wird, während der statischen Initialisierung.
Ich möchte dies ein "Change Tracking" -System zu vereinfachen. Es ist nicht ganz wie "Bean-Eigenschaften", weil diese Namen außerhalb der Klasse selbst nicht sichtbar sind.
AFAIK, gibt es keine "native" Möglichkeit, dies zu tun, aber ich hoffe, dass es einen Trick mit Anmerkungen und/oder Reflexion, die die Arbeit macht.
Ich werde schreiben, was ich jetzt tue (minimal vereinfacht):
private static final String IS_SWAPPABLE = "isSwappable";
// ...
private boolean isSwappable;
// ...
public boolean isSwappable() {
if ((clientChanges != null) &&
clientChanges.containsKey(IS_SWAPPABLE)) {
return (Boolean) clientChanges.get(IS_SWAPPABLE);
}
return isSwappable;
}
public boolean setSwappable(final boolean newSwappable) {
if (isSwappable() != newSwappable) {
isSwappable = newSwappable;
onFieldChange(IS_SWAPPABLE, newSwappable);
return true;
}
return false;
}
Was würde Ich mag einige „Magie“, die den Wert von IS_SWAPPABLE auf „isSwappable“ so setzt, dass, wenn isSwappable ist umbenannt, dann wird IS_SWAPPABLE entsprechend aktualisiert.
OTOH, wenn es eine Syntax wie Abc.isSwappable (oder AbC# isSwappable) oder was auch immer gab, würde ich mir die Konstante ersparen, und schreibe das direkt.
Was ich tun kann atm ist (einmal) über die Konstanten gehen (durch die Verwendung einiger klarer Benennungskonvention), und stellen Sie sicher, dass für jede von ihnen gibt es ein Instanzfeld mit dem gleichen Namen. Es garantiert jedoch nicht wirklich, dass IS_SWAPPABLE verwendet wird, wenn isSwappable verwendet wird.
http://stackoverflow.com/questions/13554583/is-it-possible-to-reflect -a-java-method-statisch –
[Warum MyClass.class existiert in Java und MyField.field nicht?] (http://stackoverflow.com/questions/4485875/why-myclass-class-exists-in-java -and-myfield-field-isnt) –
'auch wenn die Klasse Abc verschoben oder umbenannt wird.' In welchem Sinne? Wenn Sie die Klasse Abc entfernen, wird Ihr Programm weder kompiliert noch kann es ausgeführt werden! – Michal