Variables Java final

J'ai une variable marquée final (number_of_cubes). Je dois l'utiliser dans quelques endroits de mon code. Mais j'ai besoin de le changer en curseur. Que suggérerais-tu? C'est ce que j'ai déjà fait:

class GrimMain{
static JFrame frame = new JFrame();
public static void main(String[] args) {
    final DrawingComponent fps = new DrawingComponent();
    final int number_of_cubes = 10;
    final Rect[] r1 = new Rect[number_of_cubes];
    final JButton button1= new JButton("Start");
    button1.setLocation(700,600);
    button1.setSize(100,30);
    fps.add(button1);

    final JButton button2= new JButton("Stop");
    button2.setLocation(700,640);
    button2.setSize(100,30);
    fps.add(button2);
    button1.setEnabled(true);
    button2.setEnabled(true);

    final JSlider slider = new JSlider(JSlider.HORIZONTAL,3,10,10);
    slider.setLocation(300,600);
    slider.setSize(290, 70);
    slider.setMajorTickSpacing(330);
    slider.setMinorTickSpacing(115);
    slider.setPaintTicks(false);
    slider.setPaintLabels(true);
    fps.add(slider);
    slider.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent changeEvent) {

           //I want to change it here but I cant 
            number_of_cubes = Integer.valueOf(slider.getValue())
        }
    });

    button2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            for(int i=0;i< number_of_cubes;i++){
                fps.addRect(r1[i]);
            }
            fps.animate();
            button1.setEnabled(false);
            button2.setEnabled(true);
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fps.setPreferredSize(new Dimension(900, 700));
    frame.getContentPane().add(fps);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
}

Ceci est le code complet de ma classe

0
final signifie: cette variable ne peut pas changer. Vous voulez changer sa valeur. Donc n'utilisez pas final. Définissez une classe et faites de cette variable une variable d'instance de la classe.
ajouté l'auteur JB Nizet, source
Ensuite, vous pouvez en faire une variable d'instance, car vous ne pouvez pas modifier une variable locale dans une classe interne.
ajouté l'auteur Rohit Jain, source

3 Réponses

Vous ne pouvez pas déclarer quelque chose comme il ne changera pas et ensuite le changer plus tard. L'état des docs:

Une variable peut être déclarée finale. Une dernière variable peut seulement être   affecté à une fois. Déclarer une variable finale peut être utile   documentation que sa valeur ne changera pas et peut aider à éviter   erreurs de programmation.

Puisque la valeur des cubes va changer, vous ne pouvez pas le déclarer comme final . Souvenez-vous que les valeurs final sont constantes et que les constantes ne changent pas.

0
ajouté

Final est plus comme une décision de conception et un indice pour le compilateur qu'autre chose. Vous pouvez définir quelque chose comme final, donc le compilateur vous dira si vous accidentellement l'avez changé ailleurs. De plus, le compilateur peut effectuer diverses optimisations s'il sait que la variable ne sera jamais modifiée.

Donc, si votre nombre de cubes peut changer avec le temps, ce n'est pas un candidat pour final .

Votre code a toutefois un problème différent si vous supprimez réellement le final: si number_of_cubes change, la taille du tableau ne change pas avec lui, donc plus tard vous obtiendrez une ArrayIndexOutOfBoundsException pour notifier que vous avez violé les contraintes de tableau. Cela peut être une bonne idée d'écrire un setter pour le nombre de cubes à la place, cela ajuste tout le reste qui a besoin d'être ajusté. Exemple:

void setNumberOfCubes(int cubes) {
  number_of_cubes = cubes;
  r1 = Arrays.copyOf(r1, cubes);
}
0
ajouté

if you need to change it then you can't have it as a final, this may give you some insight on it, http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

Votre nombre de cubes est un primatif et non un objet, donc modifier la valeur viole son état final.

0
ajouté
+1 Bonne réponse. Juste le formater mieux la prochaine fois. assurez-vous de copier les informations pertinentes du lien ici. =) veuillez vérifier vos orthographes
ajouté l'auteur Little Child, source
N'oubliez pas de formater votre réponse de manière à ce que l'OP puisse obtenir plus facilement ce dont il a besoin.
ajouté l'auteur Little Child, source
merci, je suis nouveau à toute la question de répondre à des questions, j'ai caché et utilisé le débordement de pile pour apprendre des choses et enfin sentir que j'ai assez de connaissances pour répondre, mais je vais travailler dessus.
ajouté l'auteur Sean, source