2011-11-01 84 views
2

我希望我的意思是我的话。 我有这样一类:访问java中其他类的私有变量

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方法的类。

+0

反射能做到这一点,但它将是一个黑客 –

回答

2

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

即:

// getter 
public JLabel getMainLabel() { 
    return mainlabel; 
} 

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

然而,这是一个不好的做法,直接返回私人数据 - 允许外部代码来修改你的个人状态。一般来说,您应该返回一份私人数据的副本,以便外部代码不会混淆您班级的内部信息。但是如果你需要外部代码来调用私有数据的方法,那么你应该在你的类中提供操作方法,而不是直接暴露私人数据。

你可能真的在你的主类,以创建像setText()getText()方法,然后调用mainlabelsetText()getText()方法。但是,您需要注意这一点,因为您可能倾向于复制班级中由JLabel定义的每种方法。这将使您的班级和其消费者与JLabel实施紧密结合。如果您选择将其他产品替换为JLabel,则需要花费大量工作来消除您创建的耦合。

0

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

所以它会像下面的一流

sample.setMethod(mainlabel); 

而且你的假设通过使用setter方法在不同类设置私有变量是正确的。

0

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

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();