Ich schreibe etwas Java-Code und in einem Moment wurde ich auf eine Sache blockiert.Cheat mit Java endgültigen Schlüsselwort
final String action = "action1";
final Button otherAction = (findById....);
otherAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (action.equals("action1")) {
action = "action2";
} else if (action.equals("action2")) {
action = "action3";
} else if (action.equals("action3")) {
action = "action1";
}
}
});
Offensichtlich dieser Code funktioniert nicht, weil ich keinen neuen Wert zu action
zuweisen kann, weil es eine endgültige Variable ist und so kann nur einmal initialisiert werden.
Um auf eine Variable innerhalb des onClickListener-Bereichs zuzugreifen, müssen Sie sie als final deklarieren.
Also, was ich tat, zu beheben ist:
final Button otherAction = (findById....);
otherAction.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (t.action.equals("action1")) {
t.action = "action2";
} else if (t.action.equals("action2")) {
t.action = "action3";
} else if (t.action.equals("action3")) {
t.action = "action1";
}
}
});
Class t {
public static String action = "action1";
}
Meine Frage ist: Warum ist das Arbeits?
aus dem einfachen Grund - 't.action' ist nicht endgültig –
anonyme innere Klassen können nur auf Variablen zugreifen, die effektiv final sind. Es wurde [hier im Detail erklärt] (http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-anonymous-class) – CarefreeCrayon
@Raman Shrivastava Richtig, aber ich denke das Wesentliche der Frage des OP ist, warum nicht "t.action" endgültig sein muss, wenn es als eine 'public static'-Klassenvariable definiert ist, während es als final sein muss, wenn es nur eine lokale Variable ist. –