2011-11-01 37 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();