2011-11-01 4 views
2

나는 내 말 뜻을 바랄뿐입니다. 나는이 같은 클래스 :이 같은자바의 다른 클래스에서 개인 변수에 액세스

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) 거기에 더 낫거나 올바른 해결책이 있습니까? main 메서드를 가진 클래스는 MainClass입니다.

+0

반사가 있지만 그것을 할 수 있습니다 당신은 SampleClass에게 생성자를 통해 MainClass에 대한 참조 또는 setter 메소드를 제공 할 수 있습니다 해킹이 될거야. –

답변

2

다른 클래스의 전용 변수에 액세스하는 올바른 방법은 getter 및 setter 메서드입니다. 그렇지 않으면 변수를 public으로 설정해야합니다. 이다

: - 외부 코드가 개인 상태를 수정할 수 있습니다 그러나

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

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

, 바로 개인 데이터를 반환하는 것은 좋은 방법입니다. 일반적으로 개인 데이터의 복사본을 반환해야 외부 코드가 클래스 내부를 엉망으로 만들 수 없습니다. 그러나 개인 데이터의 메서드를 호출하기 위해 외부 코드가 필요하면 개인 데이터를 직접 노출하는 대신 클래스에서 조작 메서드를 제공해야합니다.

당신은 아마 정말이 당신의 메인 클래스에 setText()getText() 같은 방법을 만든 다음 mainlabelsetText()getText() 메소드를 호출 할

. 그러나 클래스에 JLabel으로 정의 된 모든 단일 메서드를 복제하려는 경향이 있으므로이 작업에주의해야합니다. 그러면 클래스와 소비자가 모두 JLabel 구현과 긴밀하게 연결됩니다. JLabel을 향후 다른 것으로 교체하기로 한 경우 사용자가 만든 커플 링을 푸는 데 많은 시간이 걸릴 것입니다.

0

클래스에서 private 변수에 대한 getter 메서드를 명시 적으로 호출하지 않고도 개인 변수를 사용할 수 있습니다.

그래서 첫 번째 클래스

sample.setMethod(mainlabel); 

그리고 세터 방법을 사용하여 다른 클래스의 private 변수를 설정하기위한 당신의 가정을 위해 아래와 같은 것이 올바른지.

0

MainClass가 JLabel을 변경하여 (새 것을 작성하여) 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(); 
관련 문제