web-dev-qa-db-fra.com

erreur: impossible d'affecter une valeur à la variable finale

Je travaille sur une affectation et je suis bloqué sur cette erreur: impossible d'affecter une valeur au nombre de variables final

Voici mon code jusqu'à présent ...

public class List
{
    private final int Max = 25;
    private final int count; 
    private Person list[];

    public List()
    {
        count = 0; 
        list = new Person[Max];
    }

    public void addSomeone(Person p)
    {
        if (count < Max){
            count++; // THIS IS WHERE THE ERROR OCCURS 
            list[count-1] = p;
        }
    }

    public String toString()
    {
        String report = "";

        for (int x=0; x < count; x++)
            report += list[x].toString() + "\n"; 

        return report;
    }
}  

Je suis très nouveau en Java et je ne suis évidemment pas un expert en informatique, alors expliquez le problème/la solution dans les termes les plus simples possibles. Merci beaucoup.

8
Kathryn

count++; générera une erreur. Par Oracle,

Une variable finale ne peut être affectée qu’une fois. Déclarer une variable finale peut servir de documentation utile, indiquant que sa valeur ne changera pas et peut aider à éviter les erreurs de programmation.

Vous pouvez suivre cet article ici . En regardant votre code, il semble que vous ne voulez vraiment pas que count soit final. Vous voulez pouvoir changer sa valeur tout au long du programme. Le correctif serait de supprimer le modificateur final.

10
Michael

Lorsque vous déclarez une variable final, vous dites essentiellement au compilateur que cette variable est constante et qu'elle ne changera PAS. Vous avez déclaré count final, mais vous ne l'avez pas encore initialisé (défini une valeur). C'est pourquoi vous avez été autorisé à définir sa valeur dans votre constructeur public List() {}: les variables finales peuvent être initialisées une fois, puis ne peuvent plus être modifiées.

Il existe toutefois des exceptions à cette règle. Si, par exemple, vous créez un objet avec une valeur int de count et ajoutez un setter, vous pourrez toujours modifier l'objet final.

Exemple de cela:

public class ExampleObject {
    private int count;

    public ExampleObject(int count) {
        this.count = count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getCount() {
        return count;
    }
}

public class ExampleDemo {

    private static final ExampleObject obj = new ExampleObject(25);

    public static void main(String[] args) {
        obj = new ExampleObject(100); //not allowed: cannot assign a value to final variable
        obj.setCount(100); //allowed
    }
}
3
nbokmans

C'est une erreur de projection parce que vous avez déclaré compter comme une variable finale. Les variables finales ne sont que des constantes. Nous ne pouvons pas changer la valeur d'une variable finale une fois qu'elle est initialisée.

1
light

Le mot clé "final" fonctionne comme une constante. Vous pouvez attribuer une valeur à ce moment-là et au moment de la déclaration ou vous pouvez attribuer une valeur à un constructeur, mais également une seule fois. Vous ne pouvez pas augmenter sa valeur plus bas dans le code. C'est pourquoi count ++ générera une erreur.

Sachez également que 'final', lorsqu'il est utilisé avec des classes ou des fonctions, empêche leur héritage dans la sous-classe.

0
Tanzeel