2009-12-11 3 views
2

Java에서 일부 리팩토링을 수행해야하며 어느 정도의 바이너리 호환성을 유지해야합니다. 이 경우에는 더 이상 사용되지 않고 오히려 커다란 (또한 사용되지 않을 수도있는) 외부 종속성을 필요로하는 일부 레거시 인터페이스를 제거하려고합니다.인터페이스에서 객체에 대한 메소드 호출 코드를 제거합니까?

I 인터페이스를 구현하는 클래스 C이 있고 C 인스턴스에서 (인터페이스에 선언 된) 메서드를 호출하는 코드가 있습니다. 호출 코드는 인터페이스가 아니라 C을 사용하고 있음을 알고 있습니다.

class C implements I { 
     void theMethod(){} ; // is declared in the interface I 
} 

C object; 
object.theMethod(); 

내가 클래스 정의에서 인터페이스를 제거합니다 (그러나 모든 방법을 유지)하는 경우 (모든 인터페이스를 참조하지 않음) 호출 코드는 여전히 (재 컴파일없이) 작동합니까?

+0

이 질문을 작성하고 서식을 지정하는 것보다 시도하는 데 시간이 덜 걸립니다.) –

+0

내 손님이 되십시오 ;-) – Thilo

+0

완료되면 관심있는 상황에 대한 내 대답의 링크를 참조하십시오. –

답변

5

예, 어디서든 명시 적으로 인터페이스 I을 참조하지 않는 한 작동합니다. JLS: Resolution of Symbolic References 가입일

: 진 이름 를 사용

클래스 또는 인터페이스 참조 이진 표현 다른 클래스 과 인터페이스 및 그 분야 방법 및 상징적 생성자 (§13.1)의 CLA를 필드/방법을 참조하여 다른 클래스 및 인터페이스

클래스 ClientClass s C에는 클래스가 구현할 수있는 I 인터페이스에 대한 암시 적 참조가 없습니다.

+0

추상 기본 클래스를 제거하고 부모없는 자식 클래스에 메서드를 추가 할 수 있습니까? – Thilo

+1

예, 동일한 규칙이 적용됩니다. 기본 클래스는 추상 클래스 일 필요조차 없습니다. 전체 계층을 하위 클래스로 "평평하게"하는 한 ** 기본 클래스는 클라이언트 코드에서 명시 적으로 참조되지 않습니다. – ChssPly76

+0

다음은 메소드/생성자 선언에 대한 JLS 섹션입니다. http://java.sun.com/docs/books/jls/third_edition/html/binaryComp.html#45197 – ChssPly76

1

Interface를 어디서나 가져 오는 경우 호출 코드에 문제가있을 수 있습니다. 호출 코드에 인터페이스의 import이 없으면 리팩토링이 계획대로 작동 할 것이라고 합리적으로 확신 할 수 있습니다.

+0

예, 해당 인터페이스가 사용되는 유일한 장소는 다음과 같습니다. (또는 지금까지 ...) 클래스 선언. – Thilo