Java 8에서는 구체적인 클래스에서 구현해야하는 선언 외에 인터페이스의 메소드에 대한 기본 구현을 가질 수 있습니다.메서드 추가 또는 인터페이스에 메서드 추가 안 함?
인터페이스에 기본 메소드를 포함하는 것이 좋은 설계입니까, 아니면 우수 사례입니까, 아니면 Java 8이 이전 API에 대한 지원을 더 많이 제공 했습니까? 새로운 Java 8 프로젝트에서 기본 메소드를 사용해야할까요?
여기에 좋은 디자인이 무엇인지 자세히 설명해주세요.
Java 8에서는 구체적인 클래스에서 구현해야하는 선언 외에 인터페이스의 메소드에 대한 기본 구현을 가질 수 있습니다.메서드 추가 또는 인터페이스에 메서드 추가 안 함?
인터페이스에 기본 메소드를 포함하는 것이 좋은 설계입니까, 아니면 우수 사례입니까, 아니면 Java 8이 이전 API에 대한 지원을 더 많이 제공 했습니까? 새로운 Java 8 프로젝트에서 기본 메소드를 사용해야할까요?
여기에 좋은 디자인이 무엇인지 자세히 설명해주세요.
이전 자바 버전에서는 구체적이고 선언 된 메서드 만 사용하는 추상 클래스를 사용할 수 없었습니다. 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();
처럼이 인터페이스의 모든 작업을 이용할 수있는 경우 사람은 총을 사용하여 칼과 다른 물건을 사용하여 싸울 수 있습니다. 따라서 인터페이스는 축복이지만 항상 필요에 따라 사용할 수 있습니다.
이전 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)
호출을한다. 신경 쓰지 않는 사람들은 코드를 수정할 필요가 없습니다!
참고하시기 바랍니다 : 물론 인터페이스에만 적용됩니다. 이 접근법을 사용하여 서명을 변경하거나 기존 인터페이스에서 메소드를 삭제할 수 없습니다.
따라서 : 새로운 메서드를 인터페이스에 추가하기 만하면됩니다. 그 방법을 바로 구현하려면 기본값 인이 있어야합니다. 기존 클라이언트 코드를 깨지 않고 거대한 앞으로!
의미 : 기존 인터페이스에서 기본값 인 메서드를 사용하지 않는 이유는 무엇입니까? 기존 코드은 상관하지 않습니다. 새로운 기본 메소드에 대해서는 알지 못합니다.
인터페이스의 기본 메소드에는 몇 가지 제한 사항이 있습니다. 인터페이스에 데이터 변수를 사용할 수 없습니다. 일반적으로 다음과 같은 이유로 기본 메소드가 추가되었습니다. 이전 버전에서 인터페이스 "A"를 구현하는 클래스를 작성했습니다. 다음 버전에서는 인터페이스 "A"에 메소드를 추가하는 것이 좋습니다. 그러나 "A"를 구현 한 클래스는 이제 그 추가 메서드를 가지지 않으므로 컴파일 할 수 없으므로 그렇게 할 수 없습니다. 이것은 이전 버전과의 호환성이 크게 떨어질 수 있습니다. 따라서 Java 8에서는 인터페이스에 기본 메소드 구현을 추가 할 수 있으므로 "A"의 구버전을 구현 한 모든 클래스가 손상되지는 않지만 기본 구현으로 되돌아갑니다. 실제로 기존 인터페이스를 확장해야하는 경우에만이 기능을 사용하십시오.
메소드의 '기본'구현이라는 용어를 사용하고 있습니까? 인터페이스의 메소드에 * content *를 추가 할 수있는 다른 방법은 없습니다. – Zabuza
http://www.tutorialspot.com/java8/java8_default_methods.htm ... 그래서 내가 중복을 찾을 수 없기 때문에 upvoted. –
기본 방법을 사용하는 IMHO는 좋은 연습은 피하고 디버깅을 다소 어렵게 만들 수 있으며 실제로 보관하려는 경우 동일한 기능을 제공하는 추상 클래스로 이동할 수 있습니다. –