문제

코코아 대표와 동등한 Java는 무엇입니까?

(나는 인터페이스를 수업에 전달할 수 있고 해당 수업이 적절한 방법을 전화하게 할 수 있다는 것을 이해하지만 Cocoa/Objective-C의 비공식 프로토콜에 더 가까운 것을 달성 할 수있는 다른 방법이 있는지 궁금합니다).

도움이 되었습니까?

해결책

짧은 대답은 Java가 원하는만큼 가까이있는 것이 없지만 대안이 있습니다. 대의원 패턴은 구현하기가 어렵지 않으며 Objective-C로 수행하는 것만 큼 편리하지 않습니다.

"비공식 프로토콜"이 Objective-C에서 작동하는 이유는 언어가 지원하기 때문입니다. 카테고리, 이를 통해 서브 클래스를 서브 클래스를 만들거나 소스 코드에 액세스하지 않고 기존 클래스에 메소드를 추가 할 수 있습니다. 따라서 대부분의 비공식 프로토콜은 NSObject의 범주입니다. 이것은 Java에서 분명히 불가능합니다.

Objective-C 2.0은 @optional 프로토콜 방법을 선택합니다.이 프로토콜 방법은 훨씬 더 깨끗하고 새 코드에 선호되지만 Java에서 동등한 점에서 더 이상 선호합니다.

솔직히 가장 유연한 접근 방식은 대의원 프로토콜을 정의한 다음 클래스가 모든 방법을 구현하도록하는 것입니다. (Eclipse와 같은 현대 IDE를 사용하면 이것은 사소한 일입니다.) 많은 Java 인터페이스가 수반되는 어댑터 클래스를 가지고 있으며, 이는 사용자가 많은 빈 메소드를 구현하지 않아도되는 일반적인 접근 방식입니다. . (Josh Bloch는 그의 책 "Effective Java"에서 이것을 다루고 있습니다.) 나의 제안은 먼저 인터페이스 만 제공 한 다음 실제로 필요한 경우 어댑터를 추가하는 것입니다.

당신이 무엇을 하든지 던지지 마십시오 UnsupportedOperationException "구현되지 않은"방법의 경우. 이를 통해 위임 클래스가 선택 사항이어야하는 메소드에 대한 예외를 처리하도록합니다. 올바른 접근 방식은 아무것도하지 않고 기본값을 반환하는 메소드를 구현하는 것입니다.이 값은 무효 리턴 유형이없는 메소드에 대해 잘 문서화되어야합니다.

다른 팁

내가 생각할 수있는 비공식 프로토콜과 가장 좋은 아날로그는 구현자가 모든 방법을 구현하지 못하게 할 수있는 어댑터 클래스가있는 인터페이스입니다.

public class MyClass {

    private MyClassDelegate delegate;

    public MyClass () {

    }

    // do interesting stuff

    void setDelegate(MyClassDelegate delegate) {
        this.delegate = delegate;
    }

    interface MyClassDelegate {
        void aboutToDoSomethingAwesome();
        void didSomethingAwesome();
    }

    class MyClassDelegateAdapter implements MyClassDelegate {

        @Override
        public void aboutToDoSomethingAwesome() {
            /* do nothing */
        }

        @Override
        public void didSomethingAwesome() {
            /* do nothing */
        }
    }
}

그런 다음 누군가가 와서 관심있는 것들을 구현할 수 있습니다.

class AwesomeDelegate extends MyClassDelegateAdapter {

    @Override
    public void didSomethingAwesome() {
        System.out.println("Yeah!");
    }
}

"알려진"방법을 호출하는 순수한 반사. 그러나 그것은 미쳤다.

Java 객체에서 대의원 패턴을 사용하는 것을 막는 것은 없습니다 (코코아에서와 같이 JDK에서 일반적으로 사용되는 패턴은 아닙니다). 그냥 가지고 있습니다 delegate 귀하를 준수하는 유형의 Ivar WhateverDelegate 인터페이스, 인스턴스 메소드에서 위임하려는 메소드에서 메소드 호출이 존재하는 경우 대의원 객체에 전달하십시오. 당신은 아마도 많은 것처럼 보이는 무언가로 끝날 것입니다 이것, OBJ-C 대신 Java를 제외하고.

선택적 인터페이스가 진행되는 한 더 어려울 것입니다. 인터페이스를 선언하고, 옵션 메소드를 빈 메소드로 구현하는 추상 클래스를 선언 한 다음, 초록 클래스를 서브 클래스 하여이 특정 객체를 구현하려는 선택적 방법을 재정의하는 것이 좋습니다. Java의 여러 상속이 부족하여 잠재적으로 심각한 제한이 있지만, 제가 생각해 볼 수있는만큼 가깝습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top