2013-03-02 3 views
0

습관의 한 형태로서, 나는 일반적으로 테스트를 위해 정적 메소드에 보관하지 않으며 내 Java 프로젝트의 라인을 쉽게 사용할 수 있습니다. 그러나 과거에는 클래스의 정적이 아닌 인스턴스를 만드는 한 가지 방법 만 알고 있었기 때문에 주 클래스를 중심으로 회전하는 정적 메서드와 비 정적 메서드를 지저분하게 혼합해야했습니다. 일반적으로, 나는 이것을 각 메소드에서 클래스 메소드를로드하는 것이 아니라 전역 변수로 사용한다.모든 것을 비 정적으로 만들기

예를 들어, MainGUI 및 ProjMain 클래스가 있다고 가정 해 봅시다. 자연스럽게 나는 동일한 기능을 수행 할 이동, 나는 내가 MainGUI 클래스에서 액세스 할 ProjMain 클래스 내에서 메소드가 그러나 경우에, 이것은 아주 잘 작동

private MainGUI gui = new MainGUI(); 

: ProjMain, 나는 전역 변수를 사용합니다.

private ProjMain project = new ProjMain(); 

이 기사에서는 StackOverflowError를 만듭니다. 전역 메소드가 아닌 개별 메소드에 변수를 넣지 않고도 클래스의 인스턴스를 변수로 가져 오는 간단한 방법이 있습니까?

+0

왜 정적 인 것을 피고 싶습니까? 특정 인스턴스가 여러 개 존재하지 않는다면 구체적인 클래스를 만들고 필요없는 인스턴스를 만드는 데는 아무런 이점이 없습니다. 인스턴스 데이터가 필요없는 메소드를 제공하는 경우 정적으로 만들어야합니다. 사용중인 패턴은 "싱글 톤"패턴이지만 일반적으로 싱글 톤을 포함하는 변수는이 모든 문제를 피하는 정적 변수입니다. 일부 프로그래머들은 정적 인 것을 피해야한다고 생각하는 것은 제 경험입니다. 왜냐하면 어떻게 든 "객체 지향적"이 아니기 때문입니다. 그러나 하나만 필요하다면 정적을 사용하십시오. – AgilePro

답변

2

, 여기 당신을 위해 다른 꽤 좋은이됩니다 호버의 솔루션 :

당신이있는 경우를 많은 클래스가 서로를 참조 할 때 상위 레이어를 추출해야한다고 생각하면 상위 레이어 클래스는 다음과 같아야합니다.

class HigherLayer { 
    public void dosomething(ProjMain pm, MainGUI mg){ 
     pm.hello(mg); 
     mg.bye(pm); 
    } 
} 

그리고 ProjMain 및 MainGUI에서 전역 변수를 제거하여 결합을 줄입니다.

+0

좋은 답변입니다!1 + –

+0

약간의 조정 후,이 환상적인 작품! – Rogue

1

클래스는 서로에 대한 참조를 가지고 있지만 괜찮습니다. 그러나 각각 다른 클래스에 대한 참조를 새로 작성하면 아무 것도 수행하지 않지만 무언가를 수행하지만 다른 인스턴스의 인스턴스를 만드는 무한 재귀가 발생하므로 클래스에 대한 참조가 생성됩니다. 첫 번째의 인스턴스를 생성하고 다른 인스턴스를 생성하여 첫 번째 인스턴스를 생성하고 다른 인스턴스를 생성하는 등 .....

이 문제를 해결하려면 하나의 객체를 생성하십시오 다른 하나는 자체에 대한 참조를 에 전달하고 다른 하나는 생성자 또는 설정 메소드를 통해 전달합니다. 예를 들어

, 첫 번째 클래스 :

public class FirstClass { 
    private SecondClass secondClass; 

    public FirstClass() { 
    secondClass = new SecondClass(this); 
} 

다른 클래스

public class SecondClass { 
    private FirstClass firstClass; 

    public FirstClass(FirstClass firstClass) { 
    this.firstClass = firstClass; 
} 
+0

이것은 두 클래스의 예제에서 작동하지만 좀 더 광범위하게 묻습니다. 실제 프로젝트에는 약 12 ​​개의 클래스가 있는데, 클래스를 반복적으로 만들지 않고 이와 비슷한 것을 얻고 싶습니다. – Rogue

+0

@SpencerAlderman : 개념은 동일합니다. 필요에 따라 신청하십시오. 그러나 좀 더 구체적인 도움이 필요하면 질문을 편집하고 질문에 더 많은 정보와 코드를 제공해야 할 수도 있습니다. –

+0

아하, 내가 편집하기 전에 조금 앞서있어. 네가 지금 뭐라고하는지 안다. 고마워! – Rogue

관련 문제