2 votes

Variables statiques en Java pour un test oObject creator

J'ai quelque chose comme ce qui suit

TestObjectCreator{

    private static Person person;

    private static Company company;

static {
    person = new Person()
    person.setName("Joe");
    company = new Company();
    company.setName("Apple");
}

public Person createTestPerson(){
    return person;
}

 public Person createTestCompany(){
    return company;
}

}

En appliquant static{}, qu'est-ce que je gagne ? Je suppose que les objets sont des singletons par conséquent. Cependant, si je faisais ce qui suit :

  Person person = TestObjectCreator.createTestPerson();
  person.setName("Jill");
  Person person2 = TestObjectCreator.createTestPerson();

la personne 2 s'appellerait-elle Jill ou Joe ?

2voto

Zoe Points 850

Le mot clé static sur les champs les fait se comporter comme des instances de classe. Il n'existe qu'une seule copie de l'objet pour l'ensemble de la classe, et toutes les instances de la classe partagent la même copie. Le constructeur statique que vous avez créé est appelé lorsque la classe est chargée dans la JVM. Il configure les champs statiques de la classe. Ensuite, toute modification des champs statiques est répercutée sur toutes les instances de l'objet.

Dans votre exemple, cela signifie que lorsque la classe TestObjectCreator est chargée dans la JVM, la personne est créée et son nom est défini comme "Joe". Vous récupérez ensuite cette personne avec le premier appel TestObjectCreator.createTestPerson(), et changez le nom de la personne en "Jill". Comme il n'y a qu'une seule personne pour TestObjectCreator, vous avez maintenant changé le nom de la personne dans tous les cas. Ainsi, la personne 2 s'appellera "Jill".

0voto

Snehal Points 1769

Je ne vois pas votre méthode setter, mais ce serait Jill, au cas où vous l'auriez implémentée correctement.

Actuellement, votre classe n'est pas complètement un singleton car il est toujours possible de créer plusieurs instances de votre classe. Afin de rendre votre classe singleton, rendez votre constructeur privé. Ensuite, écrivez une instance statique de TestObjectCreator et renvoyez-la via une méthode de fabrique statique.

L'avantage de rendre la Personne et la Société statiques est que toutes les instances du TestObjectCreator auront la même copie de la Personne et de la Société. Je ne suis pas sûr que ce soit ce que vous voulez, mais c'est ce que static vous fournit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X