जावा चर अंतिम

मेरे पास एक चर है जो अंतिम (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.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);
}
}

यह मेरी कक्षा का पूरा कोड है

0
जोड़ा संपादित
विचारों: 1
अंतिम मतलब: यह चर बदल नहीं सकता है। आप इसका मूल्य बदलना चाहते हैं। तो अंतिम का उपयोग न करें। एक कक्षा को परिभाषित करें, और इस चर को कक्षा के एक आवृत्ति चर बनाओ।
जोड़ा लेखक JB Nizet, स्रोत
फिर आप इसे आवृत्ति चर बना सकते हैं, क्योंकि आप एक आंतरिक चर के अंदर एक स्थानीय चर को संशोधित नहीं कर सकते हैं।
जोड़ा लेखक Rohit Jain, स्रोत

3 उत्तर

आप यह नहीं बदलेगा के रूप में कुछ घोषित नहीं कर सकते हैं और फिर इसे बाद में बदल सकते हैं। दस्तावेज़ राज्य:

एक चर को अंतिम घोषित किया जा सकता है। एक अंतिम चर केवल हो सकता है   एक बार सौंपा गया। एक परिवर्तनीय फाइनल घोषित करने के रूप में उपयोगी हो सकता है   दस्तावेज है कि इसका मूल्य नहीं बदलेगा और इससे बचने में मदद मिल सकती है   प्रोग्रामिंग त्रुटियां

चूंकि क्यूब्स का मान बदल जाएगा, इसलिए आप इसे final के रूप में घोषित नहीं कर सकते हैं। याद रखें कि अंतिम मान स्थिरांक हैं और स्थिरांक नहीं बदलते हैं।

0
जोड़ा

फाइनल एक डिजाइन निर्णय और किसी और चीज की तुलना में संकलक के लिए एक संकेत की तरह है। आप कुछ को अंतिम के रूप में परिभाषित कर सकते हैं, इसलिए संकलक आपको बताएगा कि क्या आपने गलती से इसे कहीं और बदल दिया है। इसके अलावा संकलक विभिन्न अनुकूलन कर सकता है अगर यह जानता है कि चर कभी नहीं बदला जाएगा।

तो यदि समय के साथ आपकी संख्या में क्यूब्स बदल सकते हैं, तो यह सिर्फ final के लिए उम्मीदवार नहीं है।

यदि आप वास्तव में अंतिम को हटाते हैं तो आपके कोड में एक अलग समस्या है: यदि संख्या_of_cubes बदलती है, तो सरणी का आकार इसके साथ नहीं बदलता है, इसलिए बाद में आपको यह पता लगाने के लिए एक ArrayIndexOutOfBoundsException मिलेगा कि आपने सरणी बाधाओं का उल्लंघन किया है। इसके बजाय क्यूब्स की संख्या के लिए एक सेटटर लिखना एक अच्छा विचार हो सकता है, जो समायोजन की आवश्यकता वाले सभी चीजों को समायोजित करता है। उदाहरण:

void setNumberOfCubes(int cubes) {
  number_of_cubes = cubes;
  r1 = Arrays.copyOf(r1, cubes);
}
0
जोड़ा

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

आपकी क्यूब्स की संख्या एक प्राइमेटिव है और ऑब्जेक्ट नहीं है इसलिए मूल्य को संशोधित करने से यह अंतिम स्थिति का उल्लंघन करता है।

0
जोड़ा
+1। अच्छा उत्तर। अगली बार बस इसे बेहतर प्रारूपित करें। यहां से लिंक से प्रासंगिक जानकारी की प्रतिलिपि बनाना सुनिश्चित करें। =) कृपया अपनी वर्तनी जांचें
जोड़ा लेखक Little Child, स्रोत
बस अपने उत्तर को ऐसे तरीके से प्रारूपित करना याद रखें जो ओपी के लिए उसे आवश्यकतानुसार प्राप्त करना आसान बनाता है।
जोड़ा लेखक Little Child, स्रोत
धन्यवाद, मैं पूरी उत्तर देने वाली प्रश्नों के लिए नया हूं, मैंने सामान सीखने के लिए छेड़छाड़ की है और स्टैक ओवरफ़्लो का उपयोग किया है और अंततः मुझे लगता है कि मेरे पास जवाब देने के लिए पर्याप्त ज्ञान है, लेकिन मैं इस पर काम करूंगा।
जोड़ा लेखक Sean, स्रोत