Comment déclarer une méthode qui ne peut pas modifier les membres de la classe en Java? [dupliquer]

Nov 30 2020

En C ++, nous faisons une méthode constante, et donc cela ne peut pas changer la valeur des membres de la classe, mais comment puis-je le faire en Java? J'ai essayé la déclaration de méthode finale, qui serait l'équivalent des consts en C ++, mais les méthodes finales sont une autre chose différente. Je veux créer une méthode getter, donc elle ne peut pas changer les valeurs, seulement la lire. Comme une méthode en lecture seule.

Réponses

10 AlexShesterov Nov 30 2020 at 17:16

En Java, il n'est pas possible d'empêcher de manière déclarative une méthode de modifier les champs non finaux. Il n'y a pas de "const correctness" en Java.

Si un champ de classe est non- final, il peut être modifié par n'importe quelle méthode de la classe.

Notez que cela finalfonctionne différemment sur les champs et les variables par rapport aux méthodes et aux classes:

  • Un finalchamp ou une variable est une constante. Sa valeur ne peut pas être modifiée une fois attribuée.
  • Une finalméthode ne peut pas être remplacée par des classes enfants. finalsur les méthodes n'a rien à voir avec "constness".
  • Une finalclasse ne peut pas être étendue. finalsur les classes n'a rien à voir avec "constness".

Vos options en Java sont:

  1. Rendez votre classe immuable (c'est-à-dire marquez tous ses champs final).
  2. Écrivez simplement vos getters (et autres méthodes non mutantes) attentivement :)

Encore une note. Même sur les champs et les variables, Java finaldiffère de celui de C ++ const. Par exemple:

  • finalles variables ne peuvent pas être modifiées une fois affectées, mais vous pouvez les affecter après la déclaration. Exemple:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalLes champs de classe doivent être affectés - soit directement, soit à partir d'un constructeur. Mais ces champs peuvent être assignés n'importe où dans un constructeur. Il n'y a rien de spécial comme la "liste d'initialisation" de C ++ en Java.

  • La déclaration de champ / variable / paramètre final Object objen Java est à peu près équivalente à une référence (const-) à un objet non const en C ++. Cela signifie que vous ne pouvez pas réattribuer la référence , mais vous pouvez modifier l'objet référencé lui-même. Un exemple:

      // Note that (obsolete) Date class is mutable in Java.
      final Date myDate = new Date();
    
      myDate = new Date(); // Compilation error: can't reassign a final reference!
    
      myDate.setTime(4711); // Ok, mutating referenced object is allowed!
    
salapura.stefan Nov 30 2020 at 17:17

Tu ne peux pas faire ça. La méthode finale signifie qu'elle ne peut pas être remplacée.