2016-09-05 3 views
10

Java 8에서는 구체적인 클래스에서 구현해야하는 선언 외에 인터페이스의 메소드에 대한 기본 구현을 가질 수 있습니다.메서드 추가 또는 인터페이스에 메서드 추가 안 함?

인터페이스에 기본 메소드를 포함하는 것이 좋은 설계입니까, 아니면 우수 사례입니까, 아니면 Java 8이 이전 API에 대한 지원을 더 많이 제공 했습니까? 새로운 Java 8 프로젝트에서 기본 메소드를 사용해야할까요?

여기에 좋은 디자인이 무엇인지 자세히 설명해주세요.

+1

메소드의 '기본'구현이라는 용어를 사용하고 있습니까? 인터페이스의 메소드에 * content *를 추가 할 수있는 다른 방법은 없습니다. – Zabuza

+0

http://www.tutorialspot.com/java8/java8_default_methods.htm ... 그래서 내가 중복을 찾을 수 없기 때문에 upvoted. –

+0

기본 방법을 사용하는 IMHO는 좋은 연습은 피하고 디버깅을 다소 어렵게 만들 수 있으며 실제로 보관하려는 경우 동일한 기능을 제공하는 추상 클래스로 이동할 수 있습니다. –

답변

-1

이전 자바 버전에서는 구체적이고 선언 된 메서드 만 사용하는 추상 클래스를 사용할 수 없었습니다. Java 8은 개발자가 이러한 인터페이스의 기존 구현을 손상시키지 않고 인터페이스에 새로운 메소드를 추가 할 수있게하는 "기본 메소드"또는 (Defender 메소드) 새 기능을 도입했습니다. 그것은 구체적인 클래스가 그 메소드에 대한 구현을 제공하지 못하는 상황에서 디폴트로 사용할 인터페이스 정의 구현을 허용하는 유연성을 제공합니다.

하자가 어떻게 작동하는지 이해하는 작은 예제를 고려하십시오

public interface oldInterface { 
    public void existingMethod(); 
     default public void newDefaultMethod() { 
     System.out.println("New default method" 
       " is added in interface"); 
    } 
} 

다음 클래스는 자바 JDK 8

public class oldInterfaceImpl implements oldInterface { 
    public void existingMethod() { 
     // existing implementation is here… 
    } 
} 

왜 defaut에 방법에 성공적으로 컴파일 할 것인가? 기존 JDK 프레임 워크의 리엔지니어링은 항상 매우 복잡합니다. JDK 프레임 워크에서 하나의 인터페이스를 수정하면 인터페이스를 확장하는 모든 클래스가 분리되므로 새로운 메소드를 추가하면 수백만 줄의 코드가 손상 될 수 있습니다. 따라서 기본 메서드는 이전 버전과 호환되는 방식으로 인터페이스를 확장하는 메커니즘으로 도입되었습니다.

참고 : 우리는 항상 추천 compatability.but이 역을 achive 수 그러나

인터페이스 delarations와를 사용할 수는 해당들은 좋은 결과를 위해 사용되는 것입니다. 간단한 예를 들어

당신은 interface Human_behaviour 당신이 to_Eat()to_Love()to_Fight()은 모든 인간 개체 .Like

의 고유 한 방법으로 모든 구현 클래스의 예를 말할 to_Walk();처럼이 인터페이스의 모든 작업을 이용할 수있는 경우

사람은 총을 사용하여 칼과 다른 물건을 사용하여 싸울 수 있습니다. 따라서 인터페이스는 축복이지만 항상 필요에 따라 사용할 수 있습니다.

2

이전 java8, 확장 인터페이스의 "합리적인"방법에 대해 이야기 할 때 당신은 versioned capabilities 향해 찾고 있었다 :

interface Capability ... 

interface AppleDealer { 
    List<Apples> getApples(); 
} 

와 AppleDealer를 검색하기 위해

이있다 :

당신이 좋아하는 뭔가를 그래서 클라이언트 코드가 일을 할 것

public <T> T getCapability (Class<T> type); 

같은 일부 중앙 서비스 :

다른 방법에 대한 필요성이 나오면
AppleDealer dealer = service.getCapability(AppleDealer.class); 

, 당신은 이동 :

interface AppleDealerV2 extends AppleDealer { ... 

그리고 V2를 원하는 고객, 단지 getCapability(AppleDealerV2.class) 호출을한다. 신경 쓰지 않는 사람들은 코드를 수정할 필요가 없습니다!

참고하시기 바랍니다 : 물론 인터페이스에만 적용됩니다. 이 접근법을 사용하여 서명을 변경하거나 기존 인터페이스에서 메소드를 삭제할 수 없습니다.

따라서 : 새로운 메서드를 인터페이스에 추가하기 만하면됩니다. 그 방법을 바로 구현하려면 기본값 인이 있어야합니다. 기존 클라이언트 코드를 깨지 않고 거대한 앞으로!

의미 : 기존 인터페이스에서 기본값 인 메서드를 사용하지 않는 이유는 무엇입니까? 기존 코드은 상관하지 않습니다. 새로운 기본 메소드에 대해서는 알지 못합니다.

0

인터페이스의 기본 메소드에는 몇 가지 제한 사항이 있습니다. 인터페이스에 데이터 변수를 사용할 수 없습니다. 일반적으로 다음과 같은 이유로 기본 메소드가 추가되었습니다. 이전 버전에서 인터페이스 "A"를 구현하는 클래스를 작성했습니다. 다음 버전에서는 인터페이스 "A"에 메소드를 추가하는 것이 좋습니다. 그러나 "A"를 구현 한 클래스는 이제 그 추가 메서드를 가지지 않으므로 컴파일 할 수 없으므로 그렇게 할 수 없습니다. 이것은 이전 버전과의 호환성이 크게 떨어질 수 있습니다. 따라서 Java 8에서는 인터페이스에 기본 메소드 구현을 추가 할 수 있으므로 "A"의 구버전을 구현 한 모든 클래스가 손상되지는 않지만 기본 구현으로 되돌아갑니다. 실제로 기존 인터페이스를 확장해야하는 경우에만이 기능을 사용하십시오.