문제

기본 방법은 멋진 새로운 도구에서 우리의 Java 습니다.그러나 내가 쓰려고 했을 정의하는 인터페이스 defaulttoString 방법입니다.Java 게는 이것이 금지된 이후 방법을 선언 java.lang.Object 할 수 없 defaulted.왜 이런 경우는?

내가 알고 있다는"기본 클래스의 항상 승"규칙,기본적으로(말장난;)모든 default 의 구현 Object 방법은 것을 덮어 방법에 의해서 Object 어쨌든.그러나 나는 볼 수 없는 이유가 있어야 하지 않는 예외한 방법에서 Object 에서 사용할 것을 권장합니다.특히 대 toString 그것은 매우 유용 할 수 있습니다하는 기본 구현이 없습니다.

그 이유는 무엇이며,왜 Java 디자이너 허용하지 않기로 결정 default 방법 재정의하는 방법 Object?

도움이 되었습니까?

해결책

이것은 또 다른 사람의 언어를 디자인 문제는 것 같다"물론 좋은 아이디어는"시작할 때까지 파고 실현하는 실제로 잘못된 생각이다.

이메일 은 많은 주제에 대한(그리고 다른 과목에도 있습니다.) 여러 가지가 있었 디자인의 세력을 통합을 가지고 우리에게 현재 디자인:

  • 는 욕망을 유지하는 상속 모델을 간단합니다;
  • 는 사실 한 번 보면 지난 명백한 예(예를들면,돌고 AbstractList 으로 인터페이스)에,당신은 그 상속 equals/차/toString 은 강하게 연결하는 하나의 상속 및 상태,그리고 인터페이스는 곱 상속 및 무국적자;
  • 그것은 잠재적으로 문을 열어 몇 가지 놀라운 행동을 합니다.

당신은 이미에 감동을 목표;상속과 분쟁 해결 규칙은 아주 간단 수 있도록 설계되었(클래스 승리를 통해 인터페이스,파생된 인터페이스 이상의 승리 superinterfaces,그리고 다른 어떤 충돌을 해결해 구현하는 클래스입니다.) 물론 이러한 규칙을 수정하는 예외는 아니다,하지만 난 당신을 찾을 때 시작할 때에는 문자열에는 복잡성이 증가되지 않은 작은 생각할 수 있습니다.

물론 어느 정도의 이익을 것을 정당화가 더 복잡성이지만,이 경우 그것은 없습니다.방법들을 통해 우리는 여기서 얘기하고 있는 동등한 차이며,toString.이러한 방법은 본질적으로 모든에 대한 개체 상태,그리고 그것은 클래스를 소유하는 상태가 아닌,인터페이스에 있는 최고의 위치를 확인 평등에 대한 의미 있는 클래스(특히 계약을 위한 평등은 매우 강력한;보적을 위해 몇 가지 놀라운 결과);인터페이스 작가들은 너무 멀리 제거됩니다.

그것은 쉽게 꺼내 AbstractList 예;그것은 사랑스러울 것이 우리가 할 수 있는 경우를 제거 AbstractList 고 행동으로 List 인터페이스입니다.하지만 일단 저쪽에 움직이 명백한 예,많은 다른 좋은 예를 찾을 수 있습니다.에서 루트, AbstractList 설계를 위한 하나의 유산입니다.하지만 인터페이스 설계해야합니다 여러 유산입니다.

또한,당신은 이것을 쓰는 클래스:

class Foo implements com.libraryA.Bar, com.libraryB.Moo { 
    // Implementation of Foo, that does NOT override equals
}

Foo 작가에서 보이퍼보의 구현을 같는 결론을 얻을 참조 평등,그가 모든 필요로 하는 상속에서 같음 Object.그런 다음,다음주,라이브러리 관리자 막대기를 위한"유용하게"추가 기본 equals 구현합니다.필!지금의 의미 Foo 파손되었으로 인터페이스에서 또 다른 유지 보수 도메인"유용하게"추가 기본에 대한 일반적인 방법입니다.

기본값이 있어야 할 기본값으로 초기화합니다.를 추가하는 기본값 인터페이스에는 아무도 없었(어느 곳에서 계층)에 영향을 미치지 않습의 의미 콘크리트 구현하는 클래스입니다.그러나면 기본값을 수"재정의"개체 방법을 수없는 것이 사실이다.

는 동안 그래서,그것은 보인한 기능,그것은 사실 아주 해롭:그것은 많은 추가의 복잡성에 대한 작은 증분 표현력,그것은 너무 쉬운,좋은 의도 무해하고 변화를 별도로 컴파일한 인터페이스를 훼손하는 용도의 의미를 구현하는 클래스입니다.

다른 팁

그것은 금지되어 있을 정의하는 기본방법에 대한 인터페이스 방법 java.lang.Object, 이후,기본 메지 않을 것"도달".

기본 인터페이스 방법을 덮어쓸 수 있에서 인터페이스를 구현하는 클래스고의 클래스의 구현 방법보다 우선 순위가 높은 인터페이스 구현하는 경우에도,이 방법은 구현에서는 수퍼 클래스.이후로 모든 클래스에서 상속 java.lang.Object, 는 방법에 java.lang.Object 는 것보다 우선해야에서의 기본 방법은 인터페이스와 호출될 대신 합니다.

Brian Goetz Oracle 에서 제공하는 몇 가지 더 많은 정보에서 디자인한 결정에 이 메일링 목록에 포스트.

나는 보지 않으로의 머리 Java 언어 저작자,그래서 우리로만 생각한다.하지만 저는 많은 이유와 그들과 함께 동의 절대적으로 이 문제입니다.

에 대한 주요 이유를 도입 기본방법은 추가 할 수 있는 새로운 인터페이스 방법을 파괴하지 않고 이전 버전과의 호환성의 나이를 구현합니다..기본 방법도 사용될 수 있을 제공하"편의 방법"필요없이 그들을 정의에서 각각의 구현하는 클래스입니다.

이들의 아무도 적용됩 toString 및 기타의 방법 개체입니다.간단히 말해,기본 방법을 제공하도록 설계 기본 동작이 없는 곳에 다른 정의합니다.제공하지 않는 구현으로"경쟁"기존의 다른 구현입니다.

"기본 클래스의 항상 승"규칙은 그것의 단단한 이유,too.되어 있는 클래스 정의 실시 구현하는 동안 인터페이스를 정의 기본 구현,이는 다소 약하다.

또한 도입,어떤 예외의 일반 규칙을 발생한 불필요한 복잡성과 올리는 다른 질문입니다.체(더 많거나 적은)클래스로,다른 그런데 왜 그것이 다른 행동?

모든 모든 솔루션을 제안한 것이 아마 가지고 더 많은 단점은 보다 전문가입니다.

이유는 매우 간단하다,그것은이 때문에 객체에 대한 기본 클래스를 모든 Java 클래스입니다.그래서 경우에도 우리는 개체의 방법으로 정의 기본 방법에는 몇 가지 인터페이스,그것은이 때문에 객체의 방법이 항상 사용됩니다.그 이유는 혼동을 피하기 위해,우리가 할 수없는 기본 방법은 무시체류 방법이 있습니다.

매우 어렵기만 하지 않기 때문에 답변,그것은 금지 정의 default 방법 공개 에서 방법 java.lang.Object.가 있 11 일 방법을 고려될 수 있는,세 가지 방법으로 분류해 이 질문에 대답.

  1. 의 여섯 Object 방법은 있을 수 없 default 방법이기 때문에 그들은 final 과 재정의할 수 없습니다 모: getClass(), notify(), notifyAll(), wait(), wait(long), 고 wait(long, int).
  2. Object 방법은 있을 수 없 default 방법을 이유로 위의 브라이언 Goetz: equals(Object), hashCode(), 고 toString().
  3. 두 가지의 Object 방법 default 방법,그래도 값의 기본값은 의문이에서 최고의: clone()finalize().

    public class Main {
        public static void main(String... args) {
            new FOO().clone();
            new FOO().finalize();
        }
    
        interface ClonerFinalizer {
            default Object clone() {System.out.println("default clone"); return this;}
            default void finalize() {System.out.println("default finalize");}
        }
    
        static class FOO implements ClonerFinalizer {
            @Override
            public Object clone() {
                return ClonerFinalizer.super.clone();
            }
            @Override
            public void finalize() {
                ClonerFinalizer.super.finalize();
            }
        }
    }
    
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top