首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java变量final

Java变量final
EN

Stack Overflow用户
提问于 2013-11-25 02:04:13
回答 3查看 76关注 0票数 0

我有一个标记为最终(Number_of_cubes)的变量。我需要在我的代码中的几个地方使用它。但我需要把它改成滑块。你有什么建议?这是我已经做过的事情:

代码语言:javascript
复制
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);
}
}

这是我的类的完整代码

EN

回答 3

Stack Overflow用户

发布于 2013-11-25 02:12:13

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

可以将变量声明为final。最后一个变量只能赋值一次。声明变量final可以作为有用的文档,说明它的值不会更改,并有助于避免编程错误。

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

票数 2
EN

Stack Overflow用户

发布于 2013-11-25 02:08:39

如果你需要改变它,那么你不能把它作为期末考试,这可能会让你对它有所了解,http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

你的立方体的数量是一个原生的,而不是一个对象,所以修改这个值违反了它的最终状态。

票数 1
EN

Stack Overflow用户

发布于 2013-11-25 02:19:49

最终结果更像是一个设计决策,也是对编译器的一个提示。你可以将某些东西定义为final,这样如果你不小心在其他地方修改了它,编译器就会告诉你。此外,如果编译器知道变量永远不会被更改,它可以进行各种优化。

因此,如果您的多维数据集数量可以随着时间的推移而变化,这就不是final的候选者。

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

代码语言:javascript
复制
void setNumberOfCubes(int cubes) {
  number_of_cubes = cubes;
  r1 = Arrays.copyOf(r1, cubes);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20177930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档