2015-01-25 4 views
-2

는 다음과 같은 세 가지 클래스를 고려 코드에 명확한 설계 방법을 사용 -

Class A 
{ 

    static DrMag drmag; //Avoid static variables 


    public DrMag validateCheck() 
    { 
     drmag.setName("Kane"); 
     drmag.setType("Student"); 
     drmag.setMarks(100); 

     return drmag; 
    } 

    public void saveState() 
    { 
     if(drmag != null) 
     { 
      //do something usefull 
      log.info("GREAT! drmag is not null"); 
     } 
     else 
     { 
      log.info("OOPS! drmag is null"); 
     } 

    } 

} 


class B 
{ 
    A a = new A(); 

    DrMag drmag = a.validateCheck(); 

} 

class C 
{ 
    A a = new A(); 

    a.saveState(); 

} 

가 위는 A, B 및 C

라는 이름으로 세 가지 기본 클래스입니다

먼저 B가

이라고를 drmag을 초기화 한 다음 drmag 값을 확인하는 C가 호출됩니다.

drmag이 정적 인 경우 eveything이 정상이며 결과가 나타납니다. "Ghost! drmag가 null이 아닙니다."

drmag가 정적이 아니라면 "OOPS! drmag is null"이라는 출력이 표시됩니다.

이것은 우리가 모두 클래스 B에서의 새로운 객체를 생성하고

C.

그러나 정적이 좋은 것으로 간주되지 않는 변수를 유지하고 있기 때문에 예상대로입니다. "OOPS -

그래서 하나의 방법은 B에서 전화에서 drmag 변수 설정 변수 drmag에 대한 클래스 A의 getter 및 setter 메소드를 만든 다음 C. 그러나이 여전히 출력을주고에서 전화에서 drmag 변수를 얻을 수 있습니다! drmag가 null입니다. "

class B 
{ 
    A a = new A(); 
    DrMag drmag = a.validateCheck(); 
    C c = new C(drmag); //this will call constructor of class C and initialize `drmag`.  
} 


class C 
{ 
    DrMag drmag; 

    public C(DrMag drmag) 
    { 
     this.drmag = drmag; 
    } 

    A a = new A(); 

    a.saveState(drmag); 
} 

class A 
{ 
    DrMag drmag; 


    public DrMag validateCheck() 
    { 
     drmag = new DrMag(); 
     drmag.setName("Kane"); 
     drmag.setType("Student"); 
     drmag.setMarks(100); 

     return drmag; 
    } 

    public void saveState(DrMag drmag) 
    { 
     if(drmag != null) 
     { 
      //do something usefull 
      log.info("GREAT! drmag is not null"); 
     } 
     else 
     { 
      log.info("OOPS! drmag is null"); 
     } 

    } 
} 

이 디자인은 다시 결함을 가지고 있으며, 복잡한 보이는 -

생각 다른 방법은 C 클래스의 생성자를 만들고 우리가 같은 drmag를 초기화 할 수있는 클래스 B에서 호출하는 것입니다.

static을 사용하지 않고이 상황을 해결할 명확한 방법이 있습니까?

+1

'drmag' 변수로 무엇을 시도하고 있습니까? 어떤 이유로 당신은 그것이 정적 일 필요가 있다고 결정 했습니까? – Makoto

+0

DrMag는 name, students, marks와 같은 일부 필드를 포함하는 클래스입니다. 그래서'validateCheck()'메소드는 name, students, marks에 값을 할당하고'drmag'를 리턴하는 것과 같은 일을합니다. 정적이 아니면 출력이 항상 "OOPS! drmag가 null"이기 때문에 정적이어야한다고 결정했습니다. 그 이유는 그 질문에서 설명됩니다. –

+1

나는 아직도 혼란 스럽다. 당신이 설명하는 것은'DrMag'는 데이터를 포함하는 객체입니다; 콩 같은 거 맞지? 당신이 그것이 정적 일 필요가 있다고 느끼는 이유가 있습니까?진짜 질문은,이 bean에 데이터를 넣는 곳은 어디인가요? 그리고'validateCheck' 메소드에'DrMag'의 인스턴스를 전달할 수없는 이유는 무엇입니까? – Makoto

답변

0

정적 필드는 반드시 악의가있는 것은 아닙니다. 그것들은 모든 객체 지향 언어에 존재하며 전체 클래스와 관련된 모든 것에 대한 감각을 가지고 있습니다.

많은 수의 개체와 관련된 데이터에 사용될 수 있고 문제가 발생할 수 있으므로 싫은 눈살을 앓고 있습니다. 예를 들어, 클래스 Student을 사용하여 클래스의 학생을 관리 할 수 ​​있습니다. 학교 이름은 일정하며 정적 인 필드가 될 수 있습니다. 하지만 나중에 응용 프로그램을 확장하고 다른 학교를 관리하기를 원하면 어떻게해야할까요?

정적 필드를 사용하는 경우 기능이 현재 클래스와 1-n 관계를 갖는 다른 필드의 필드가 아닌 경우 방황해야합니다.

SO에 관한 질문은 다소 광범위하며 문제 해결을위한 단서 만 제공 할 것입니다. 상세한 설명은 너무 길 것입니다. 그러나 이것은 항상 설명하기에는 너무 길다.