Il existe cinq types de Java "statique". Cependant, chacun est similaire et différent. Dans cet article, je vais vous expliquer les points pour éviter de rester coincé dans les pièges de chaque statique. Si vous souhaitez en savoir plus, veuillez vous référer aux documents de référence à la fin de l'article.
Si une méthode a un modificateur statique, elle devient une méthode statique.
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
La méthode statique semble pratique à première vue (elle semble facile à utiliser) car elle peut être appelée sans nouvelle instance. Cependant, [pour faciliter l'écriture des tests unitaires, il ne doit être utilisé que pour le "traitement de routine"](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).
Si un champ a un modificateur statique, il devient un champ statique.
public static final double PI = 3.14159265358979323846;
Comme mentionné ci-dessus, il peut être utilisé comme constante en ** l'utilisant avec le modificateur final. En l'utilisant avec le modificateur final, il est possible d'éviter des bogues tels que la réécriture de la valeur quelque part dans le programme et la sortie d'un résultat de calcul incorrect.
Selon la conception du système, il peut également être utilisé pour contenir un cache.
Il sera possible d'appeler des champs statiques et des méthodes statiques de classes externes sans spécifier de nom de classe.
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class SampleTest {
@Test
public void Test() {
assertThat("foo", is("foo"));
}
}
Dans l'exemple ci-dessus, ʻAssert.assertThat et
Matchers.is` peuvent être décrits en omettant le nom de la classe.
Si le modificateur statique est ajouté à la classe interne, il devient une classe interne statique.
public class Outer {
public static class Inner {
//classe interne statique
}
}
Les classes internes non statiques peuvent également accéder aux champs et aux méthodes d'instance de la classe parent. Par conséquent, il contient une référence à la classe parente.
Cependant, des références inutiles à la classe parente peuvent avoir un effet indésirable sur la mémoire et GC [^ 1]. ** Si la classe interne peut être rendue statique, elle doit être rendue statique ** [^ 2].
Le processus décrit dans le bloc ci-dessous est appelé lorsque la classe est accédée pour la première fois.
static {
//En traitement
}
Plus précisément, il est utilisé pour initialiser une collection de champs statiques [^ 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