web-dev-qa-db-fra.com

Quelle est la signification exacte des champs statiques en Java?

Je voudrais partager un objet entre différentes instances d'objets de la même classe.

Conceptuellement, pendant que mon programme est en cours d'exécution, tous les objets de la classe A accèdent au même objet de la classe B.

J'ai vu que static est à l'échelle du système et que son utilisation est déconseillée. Est-ce à dire que si j'ai un autre programme en cours d'exécution sur la même machine virtuelle Java qui instancie des objets de classe A, ces objets pourraient potentiellement accéder au même objet B que celui accédé dans le programme précédent?

Quels sont généralement les défauts derrière l'utilisation de champs statiques?

Existe-t-il des alternatives (qui ne nécessitent pas un énorme effort de mise en œuvre)?

34
LB40

Statique ne signifie pas tout à fait "partagé par toutes les instances" - cela signifie "pas du tout lié à une instance particulière". En d'autres termes, vous pouvez accéder au champ statique de la classe A sans jamais créer d'instances any.

Quant à l'exécution de deux programmes dans la même machine virtuelle Java, cela dépend vraiment de ce que vous entendez par "exécuter deux programmes". Le champ statique est effectivement associé à l'objet classe, qui est à son tour associé à un chargeur de classe. Donc, si ces deux programmes utilisent des instances de chargeur de classe distinctes, vous aurez deux variables statiques indépendantes. S'ils utilisent tous les deux le même chargeur de classe, alors il n'y en aura qu'un et ils verront les changements de l'autre.

Quant à une alternative - il existe différentes options. L'une consiste à transmettre la référence à l'objet "partagé" au constructeur de chaque objet que vous créez qui en a besoin. Il devra ensuite stocker cette référence pour plus tard. Cela peut être un peu pénible et aspirer un peu plus de mémoire qu'une approche statique, mais cela facilite la testabilité.

66
Jon Skeet

Les méthodes statiques et les membres sont découragés car ils sont si souvent mal utilisés, mais cela ressemble à une situation où l'électricité statique est la bonne solution. En ce qui concerne le partage statique entre plusieurs programmes, ce n'est pas le cas. Chaque programme s'exécute dans un environnement complètement séparé.

2
Pesto