2014-02-13 3 views
0

두 가지 호출의 차이점은 무엇입니까? 어떻게해야 제대로 할 수 있을까요?생성자에서 오버라이드 가능한 메서드 호출 - 메서드를 호출하는 적절한 방법은 무엇입니까?

//package test; 

public class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK 
    } 

    public void doSomething() { 
     //... 
    } 
} 

난 그냥 같은 클래스의 편의를 위해 doSomething()을 사용하고 싶습니다. 나는 나중에 그것을 무효화 할 의도가 없다. 하나의 아이디어는 그것을 final이라고 선언하는 것입니다. 그러나이 상황에서 SomeClass.this.doSomething();이 안전하게 사용되는지 확실하지 않습니다.

+1

컴파일러 경고 알림은 어떤 일이 발생할 수 있는지를 알려줍니다. 서브 클래스가'doSomething' 메소드를 오버라이드 (override)하면 (자), 클래스 인스턴스를 생성 할 때의 동작을 변경할 수 있습니다. 이것은, 설계에 따라서 위험 할지도 모릅니다. 컴파일러 예외가 아니라 경고입니다. –

+0

메서드를 재정의 할 수있게 하시겠습니까? 예, 아니요, 또는 누가 누구인가? doSomething() 메서드에 대해 public, private 또는 protected/package 범위를 사용하십시오. –

+1

"어떻게해야 제대로 수행 할 수 있습니까?"가능한 경우 이와 같은 것을 피할 수 있습니다. 메소드를 호출하거나 'final'로 선언하십시오. 항상 쉬운 일은 아니지만 최소한 고려해야합니다. – Marco13

답변

2

컴파일러 경고 알림은 어떤 일이 발생할 수 있는지에 대해 다소 말합니다. 서브 클래스가 doSomething 메소드를 오버라이드 (override)하면 (자), 클래스 인스턴스의 작성시의 동작이 변경 될 가능성이 있습니다. 이것은, 설계에 따라서 위험 할지도 모릅니다. 컴파일러 예외가 아니라 경고입니다.

class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK, but is not 
    } 

    public void doSomething() { 
     System.out.println("parent"); 
    } 
} 

public class SomeOtherClass extends SomeClass { 
    @Override 
    public void doSomething() { 
     System.out.println("child"); 
    } 

    public static void main(String[] args) { 
     SomeClass a = new SomeClass(); 
     SomeOtherClass b = new SomeOtherClass(); 
    } 
} 

인쇄 :

parent 
parent 
child 
child 

그냥 다른 클래스, doSomething 메소드를 오버라이드 (override)하지 final로 표시 할 수 원하는 경우

이를 증명하기 위해, 단지 그것을 테스트하는 코드를 확장 :

class SomeClass { 

    public SomeClass() { 

     doSomething();//Warning - Overridable method call in constructor 
     SomeClass.this.doSomething();//Seems OK 
    } 

    public final void doSomething() { 
     System.out.println("parent"); 
    } 
} 

그런 다음 하위 클래스가이를 무시하려고 시도하면 c ompiler가 오류를 발생시킵니다.

public class SomeOtherClass extends SomeClass { 
    @Override 
    public void doSomething() { //compiler error 
     System.out.println("child"); 
    } 
    //... 
} 
+0

아주 좋은 예, 감사합니다. 나는 지금 생각을 가지고있다. 또한 - SomeClass.this.doSimething(); -이 상황에서는 OK 일 것입니다. 나중에 SomeClass에서 메서드를 호출하면 나중에 재정의 할 것이므로 아무런 차이가 없다고 생각합니다. 내가 맞습니까? –

+0

@ErnestasGruodis 아니,'this'를 호출하면 현재 객체 인스턴스를 호출하고 현재 객체 유형에 속한 메소드를 실행합니다. 그렇지 않으면, could * 부모 parent child parent *를 인쇄 할 수 있습니다. –

+0

예, 당신 말이 맞아요. :) 바보 같은 말을 할 수 있습니다. :) 너무 간단했습니다. 지금 질문은 100 % 답변입니다. 참으로 도움에 감사드립니다. –

관련 문제