在Java中如何从其他类访问私有变量

6
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我希望我的话能够被理解。我有一个如下的类:

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;
    }
}

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


反射可以做到,但这将是一种hack方法。 - jmj
5个回答

4

从另一个类访问私有变量的正确方法是使用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,则需要花费很多精力来解除您所创建的耦合。

0

0
在类中,私有变量可以在不显式调用私有变量的getter方法的情况下使用。
因此,对于第一个类,它将如下所示。
sample.setMethod(mainlabel);

你的假设是正确的,可以使用setter方法在不同的类中设置私有变量。


0
你的方法存在问题,如果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();

0
创建一个修改器方法,允许访问私有变量。
public void setLabel(JLabel _label) {

mainlabel = _label;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接