我希望我的意思是我的意思。 我有一个这样的课程:
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 :(得分:3)
从另一个类访问私有变量的正确方法是使用getter和setter方法。否则,你应该将该变量公之于众。
那是:
// getter
public JLabel getMainLabel() {
return mainlabel;
}
// setter
public void setMainLabel(JLabel mainLabel) {
this.mainlabel = mainLabel;
}
但是,直接返回私有数据是一种不好的做法 - 允许外部代码修改您的私有状态。通常,您应该返回私人数据的副本,以便外部代码不会弄乱您的类的内部。但是,如果您需要外部代码来调用私有数据上的方法,那么您应该在类中提供操作方法,而不是直接公开私有数据。
您可能确实想要在主要类中创建setText()
和getText()
等方法,然后调用setText()
和getText()
方法在mainlabel
。但是,您需要小心这一点,因为您可能倾向于复制类中JLabel
定义的每个方法。这将使您的班级及其消费者与JLabel
实施紧密结合。如果您选择在将来用其他内容替换JLabel
,则需要花费大量精力来展开您创建的耦合。
答案 1 :(得分:0)
您可以使用Java Reflection访问私有变量并更改值。
http://download.oracle.com/javase/tutorial/reflect/member/fieldValues.html
为什么不通过setMainLabel公开mainlabel?
public void setMainLabel(JLabel mainLabel) {
this.mainlabel = mainLabel;
}
答案 2 :(得分:0)
在类中,可以使用私有变量而无需为私有变量显式调用getter方法。
所以对于第一堂课来说就像下面那样
sample.setMethod(mainlabel);
您使用setter方法在不同类中设置私有变量的假设是正确的。
答案 3 :(得分: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();
答案 4 :(得分:0)
创建一个允许访问私有变量的mutator方法
public void setLabel(JLabel _label) {
mainlabel = _label;
}