【问题标题】:access private variable from other class in java从java中的其他类访问私有变量
【发布时间】:2016-03-08 17:59:34
【问题描述】:

我希望我的意思是我的话。 我有这样的课:

public class MainClass extends JFrame{
    private JLabel mainlabel;
    private SampleClass sample=new SampleCalss();

    public void intital(){
        mainlabel=new JLabel("Main");
        sample.setMethod(getLabel());
        //
        //some code
        //
        add(mainlabel); 
    }

    public static void main(){
        intital();
    }

    public JLabel getLabel(){
        return mainlabel;
    }
}

和其他类似的类:

public class SampleClass extends JFrame{
    private JButton button=new JButton("Change");
    private JLabel sLabel;

    public SampleClass(){
        //somecode
        //
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                sLabel.setText("Sample text set");
            }
        });
        add(jButton);
    }

    public void setMethod(JLabbel l){
        sLabel=l;
    }
}

这是访问mainlabel 并从其他类更改其值的真正方法(在此类SampleClass 的示例代码中)是否有更好或更正确的解决方案? 请注意,MainClass 是具有 main 方法的类。

【问题讨论】:

  • 反射可以做到,但它会是一个黑客

标签: java oop


【解决方案1】:

您可以使用 Java 反射来访问私有变量并更改值。

http://download.oracle.com/javase/tutorial/reflect/member/fieldValues.html

为什么不通过 setMainLabel 暴露主标签?

public void setMainLabel(JLabel mainLabel) {
    this.mainlabel = mainLabel;
}

【讨论】:

    【解决方案2】:

    从另一个类访问私有变量的正确方法是使用 getter 和 setter 方法。否则,您应该公开该变量。

    即:

    // getter
    public JLabel getMainLabel() { 
        return mainlabel;
    }
    
    // setter
    public void setMainLabel(JLabel mainLabel) {
        this.mainlabel = mainLabel;
    }
    

    但是,直接返回私有数据是一种不好的做法 - 允许外部代码修改您的私有状态。通常,您应该返回您的私有数据的副本,这样外部代码就不会与您的类的内部发生混淆。但是,如果您需要外部代码来调用私有数据的方法,那么您可能应该在您的类中提供操作方法,而不是直接公开私有数据。

    您可能真的想在主类中创建setText()getText() 之类的方法,然后在mainlabel 上调用setText()getText() 方法。但是,您需要注意这一点,因为您可能倾向于在您的类中复制 JLabel 定义的每个方法。这将使您的类和它的消费者与JLabel 实现紧密结合。如果您将来选择将JLabel 替换为其他内容,则需要大量工作才能解除您创建的耦合。

    【讨论】:

      【解决方案3】:

      在类中,可以使用私有变量,而无需显式调用私有变量的getter方法。

      所以第一堂课会像下面这样

      sample.setMethod(mainlabel);
      

      并且您使用 setter 方法在 不同 类中设置私有变量的假设是正确的。

      【讨论】:

        【解决方案4】:

        你的方法的问题是,如果 MainClass 改变了它的 JLabel(通过创建一个新的),SampleClass 仍然有对旧的引用。您可以通过构造函数或 setter 方法为 SampleClass 提供对 MainClass 的引用:

        public class SampleClass extends JFrame{
        private JButton button=new JButton("Change");
        private MainClass main;
        
        public SampleClass(MainClass main)
        {
            this.main = main;
            // do stuff
        }
        

        并且每当你需要访问 MainClass 的标签时,调用它的 getter 方法:

        main.getLabel();
        

        【讨论】:

          【解决方案5】:

          创建一个允许访问私有变量的 mutator 方法

          public void setLabel(JLabel _label) {
          
          mainlabel = _label;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-16
            • 1970-01-01
            • 1970-01-01
            • 2018-10-28
            相关资源
            最近更新 更多