Java变量最终

时间:2013-11-24 18:04:13

标签: java

我有一个标记为final的变量(number_of_cubes)。我需要在我的代码中的几个地方使用它。但我需要将其更改为滑块。你会建议什么?这就是我已经做过的事情:

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.remRect(r1[i]);
                frame.getContentPane().repaint();
            }
            button1.setEnabled(true);
            button2.setEnabled(false);

        }
    });

    button1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            System.out.println("yes");
            Random rn = new Random();
            Random rand = new Random();
            for(int i=0; i <number_of_cubes;i++){
                float r = rand.nextFloat();
                float g = rand.nextFloat();
                float b = rand.nextFloat();
                Color randomColor = new Color(r, g, b);
                r1[i] = new Rect(rn.nextInt(600), rn.nextInt(400), 15, 15, randomColor);
            }
            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);
}
}

这是我班级的完整代码

3 个答案:

答案 0 :(得分:2)

您不能将某些内容声明为it will not change,然后再进行更改。文档声明:

  

变量可以声明为final。最终变量可能只是   分配给一次。声明变量final可以起到很大作用   文档,其价值不会改变,可以帮助避免   编程错误。

由于多维数据集的值将更改,因此您无法将其声明为final。请记住,final常量,常量不会更改。

答案 1 :(得分:1)

如果您需要更改它,那么您不能将其作为最终版本,这可能会让您对它有所了解,http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

您的立方体数量是主要的而不是对象,因此修改该值会违反其最终状态。

答案 2 :(得分:0)

最终更像是设计决策和对编译器的提示而不是其他任何东西。您可以将某些内容定义为final,因此编译器会告诉您是否意外将其更改为其他位置。此外,如果编译器知道变量永远不会被更改,则可以进行各种优化。

因此,如果您的多维数据集的数量可能会随着时间而变化,那么这不是final的候选者。

如果实际删除了final,那么你的代码有一个不同的问题:如果number_of_cubes发生了变化,那么数组的大小不会随之改变,所以稍后你会得到一个ArrayIndexOutOfBoundsException来通知你违反了数组约束。为立方体的数量编写一个setter可能是一个好主意,它可以调整其他需要调整的东西。例如:

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