45 votes

Sur les mots-clés statiques finaux en Java

Según le tutoriel :

El static en combinaison avec le modificateur final est également utilisé pour définir des constantes. Le site final indique que la valeur de ce champ ne peut pas changer.

Je ne serais d'accord que si les types concernés étaient primitifs. Avec les types de référence, par exemple une instance d'une classe Point2D où ses attributs de position n'étaient pas final (c'est-à-dire que nous pourrions changer sa position), les attributs de ce type de variables tels que public static final Point2D A = new Point2D(x,y); pourrait encore être modifié. Est-ce que c'est vrai ?

67voto

Will P Points 6355

Oui, il peut être modifié. Seules les références ne peuvent pas être modifiées, mais ses champs internes peuvent l'être. Le code suivant le montre :

public class Final {
    static final Point p = new Point();
    public static void main(String[] args) {
        p = new Point(); // Fails
        p.b = 10; // OK
        p.a = 20; // Fails
    }
}

class Point {
    static final int a = 10;
    static int b = 20;
}

Groovy (une alternative JVM ) a une annotation appelée @Immutable qui bloque la modification de l'état interne d'un objet après sa construction.

16voto

Jaco Van Niekerk Points 2574

Correct, il peut encore être modifié. Le terme "static final", dans ce cas, fait référence à la référence elle-même, qui ne peut pas être modifiée. Cependant, si l'objet qu'elle référence est mutable, alors l'objet qu'elle référence peut être modifié.

Un objet immuable, tel qu'une chaîne de caractères, sera une constante.

10voto

Narendra Pathai Points 12172
public static final Point2D A = new Point2D(x,y);

Ici, le référence A est final y pas les valeurs à l'intérieur de la classe Point2D .

Vous ne pouvez pas le faire après avoir défini A static final :

//somewhere else in code
A = new Point2D(x1,y1);

6voto

Subhrajyoti Majumder Points 20001

public static final Point2D A = new Point2D(x,y) ; pourrait encore être modifié. Cela est-il vrai ?

La référence de A n'a pas pu être modifiée mais c'est vrai La valeur de l'objet associé peut être modifiée si les attributs ne sont pas finaux.

class Point2D{
  private int x;
  private int y;
  <getter & setter>
} 
class Constant{
  Public static final Point2D A = new Point2D(1,2);
  public static void main(String[] args){
     A.setX(10); // this will work 
     A = new Point2D(10,20);// this will not work
  }
}

En cas Point2D's sont finales, alors Point2D class serait immutable .

ou vous pouvez envoyer l'objet clonable.

Comme

 private static final Point2D A = new Point2D(x,y);
 public static getA(){
     return A.clone();
 }

6voto

Grzegorz Oledzki Points 10491

C'est vrai. Le site final n'est pas transitif de quelque manière que ce soit.

Cela signifie seulement que la référence ne changera pas. Le contenu de la référence (les champs de l'objet) peut changer dans le temps.

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