Zauważyłem coś w statycznych inicjalizatorach, co może być błędem w javacu. Skonstruowałem scenariusz, w którym mogę przypisać zmiennej wartość, ale nie odczytałem tej wartości z powrotem.Statyczny błąd inicjatora, jeśli został umieszczony przed deklaracją
Dwa przykłady znajdują się poniżej, pierwszy kompiluje dobrze, drugi dostaje błąd, gdy próbuje odczytać wartość z tmp, ale z jakiegoś powodu przypisanie wartości do tmp jest dozwolone. Mogłem zrozumieć, czy nie można odczytać ani zapisać do zmiennej, ponieważ tmp jest zadeklarowany po statycznym inicjatorze, ale błąd w jednym z nich nie ma dla mnie sensu.
//Compiles Successfully:
public class Script
{
public static Object tmp;
static
{
tmp = new Object();
System.out.println(tmp);
}
}
//error only on the read but not the assignment
public class Script
{
static
{
tmp = new Object();
System.out.println(tmp);
}
public static Object tmp;
}
dla dodatkowego podkreślenia, to kompiluje się pomyślnie.
public class Script
{
static
{
tmp = new Object();
}
public static Object tmp;
}
Wierzę, że [odpowiedź na podobne pytanie] [1] odpowiada na to pytanie lepiej niż ja. To dziwne zachowanie, ale nie błąd. Robi to, co ma robić. [1]: http://stackoverflow.com/a/10035928/348975 – emory
Nie jestem pewien, czy tak jest, inicjatory statyczne są tam, aby zainicjować zmienne od ich wartości domyślnej. co oznacza, że static int v = 1; jest równoważne statycznej int v; static {v = 1;} –
@Dukeling Napisałem swój komentarz jako odpowiedź, a StackOverflow stwierdził, że moja odpowiedź była banalna (myślę, że to za krótko) i automagicznie przekonwertowałem ją do komentarza, ale ewidentnie sflaczałam linki. – emory