J'ai eu une interview Java aujourd'hui et on m'a demandé de créer une classe immuable nommée Person et on m'a donné un squelette avec quelques paramètres: âge, nom, etc. J'ai créé la classe ci-dessous:

final class Person {
  private final int age;
  private final String name;
  private final List<String> petNames;


  public Person(int a, String n, List<String> p) {
    this.age = a;
    this.name = n;
    this.petNames = p;
  }

  int getAget() {
    return this.age;
  }

  String getName() {
    return this.name;
  }

  List<String> getPetnames() {
    return this.petNames;
  }

}

On m'a dit qu'il n'est pas complet car en exécutant la séquence de code ci-dessous, vous prouvez qu'il n'est pas immuable:

int x = 3;
String name = "Alex";
List<String> ls = new ArrayList<>();
Person p1 = new Person(x, name, ls);

L'indice qui m'a été donné est qu'il est lié à la liste et que je devrais changer qc dans le constructeur. Mais je ne sais vraiment pas pourquoi et je ne comprends pas vraiment ce qui ne va pas.

Quelqu'un peut-il m'expliquer ce qu'il faut ajouter et pourquoi? Peut-être que je ne comprenais pas complètement l'immuabilité.

4
Maria1995 29 avril 2020 à 22:57

2 réponses

Meilleure réponse

Je suppose qu'ils vous ont demandé de conserver une copie immuable de la collection d'animaux de compagnie donnée.

this.petNames = List.copyOf(p);

Sinon, vous pourrez toujours modifier les animaux de compagnie d'une personne.

p1.getPetnames().add("newPet");

Vous ne devriez pas être dérangé par ce qui va arriver à ls, mais vous devez faire attention à ce que vous pouvez faire avec p1.

  1. Vous faites une copie pour ne plus vous inquiéter de savoir si l'entrée sera modifiée plus tard.
  2. Vous rendez la collection immuable, ce qui, avec les 2 derniers champs simples, rend la classe immuable.
6
Andrew Tobilko 29 avril 2020 à 20:20

Pour rendre la liste immuable, je pense que vous devriez utiliser

       this.petnames=  ImmutableList.copyOf(p);

Ou

     this.petnames  = Collections.unmodifiableList(new ArrayList<>(p));

Dans java 9, vous pouvez utiliser la méthode copyOf () pour créer une liste immuable

 this.petnames = List.copyOf(p)

Si vous le renvoyez, il n'est pas possible d'y ajouter ou de supprimer des éléments. Cependant, ils peuvent en tirer des éléments.

5
Shubham 29 avril 2020 à 21:32