Es gibt fünf Arten von Java "statisch". Jedes ist jedoch ähnlich und unterschiedlich. In diesem Artikel werde ich die Punkte erläutern, um zu vermeiden, dass Sie in den Fallstricken jeder Statik stecken bleiben. Wenn Sie weitere Einzelheiten erfahren möchten, lesen Sie bitte die Referenzmaterialien am Ende des Artikels.
Wenn eine Methode einen statischen Modifikator hat, wird sie zu einer statischen Methode.
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
Die statische Methode erscheint auf den ersten Blick praktisch (sie sieht einfach aus), da sie aufgerufen werden kann, ohne die Instanz neu zu erstellen. [Um das Schreiben von Komponententests zu vereinfachen, sollte es jedoch nur für die "Routineverarbeitung" verwendet werden](https://qiita.com/flyaway/items/34069ca6ad9ada4c0fef#%E5%95%8F%E9%A1% 8C% E3% 82% 92% E8% A7% A3% E6% B1% BA% E3% 81% 99% E3% 82% 8B% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E5% 8E% 9F% E5% 89% 87% E3% 83% AB% E3% 83% BC% E3% 83% AB).
Wenn ein Feld einen statischen Modifikator hat, wird es zu einem statischen Feld.
public static final double PI = 3.14159265358979323846;
Wie oben erwähnt, kann es als Konstante verwendet werden, indem ** es zusammen mit dem endgültigen Modifikator verwendet wird. Durch die Verwendung zusammen mit dem endgültigen Modifikator können Fehler wie das Umschreiben des Werts irgendwo im Programm und die Ausgabe eines falschen Berechnungsergebnisses verhindert werden.
Je nach Systemdesign kann damit auch ein Cache gespeichert werden.
Es ist möglich, statische Felder und statische Methoden externer Klassen aufzurufen, ohne einen Klassennamen anzugeben.
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class SampleTest {
@Test
public void Test() {
assertThat("foo", is("foo"));
}
}
Im obigen Beispiel können "Assert.assertThat" und "Matchers.is" durch Weglassen des Klassennamens beschrieben werden.
Wenn der statische Modifikator der inneren Klasse zugewiesen wird, wird er zu einer statischen inneren Klasse.
public class Outer {
public static class Inner {
//statische innere Klasse
}
}
Nicht statische innere Klassen können auch auf die Felder und Instanzmethoden der übergeordneten Klasse zugreifen. Daher enthält es einen Verweis auf die übergeordnete Klasse.
Unnötige Verweise auf die Elternklasse können sich jedoch nachteilig auf das Gedächtnis und die GC auswirken [^ 1]. ** Wenn die innere Klasse statisch gemacht werden kann, sollte sie statisch gemacht werden ** [^ 2].
Der im folgenden Block beschriebene Prozess wird aufgerufen, wenn zum ersten Mal auf die Klasse zugegriffen wird.
static {
//wird bearbeitet
}
Insbesondere wird es zum Initialisieren einer Sammlung statischer Felder verwendet [^ 3].
public static final List<String> LIST;
static {
List<String> tmp = new ArrayList<>();
tmp.add("foo");
tmp.add("bar");
LIST = Collections.unmodifiableList(tmp);
}
Recommended Posts