访问java中其他类的私有变量
我希望我的意思是我的话。 我有这样一类:访问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
方法的类。
从另一个类访问私有变量的正确方法是使用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
,则需要花费大量工作来消除您创建的耦合。
您可以使用Java反射访问私有变量并更改值。
http://download.oracle.com/javase/tutorial/reflect/member/fieldValues.html
为什么不暴露通过setMainLabel的mainlabel?
public void setMainLabel(JLabel mainLabel) {
this.mainlabel = mainLabel;
}
在类中,可以使用私有变量而不显式调用私有变量的getter方法。
所以它会像下面的一流
sample.setMethod(mainlabel);
而且你的假设通过使用setter方法在不同类设置私有变量是正确的。
你的方法的问题是,如果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();
反射能做到这一点,但它将是一个黑客 –