문제

특정 XML 파일을 구문 분석하는 동안 특정 태그가 특정 범주에 속한다는 것을 식별하기 위해 레이블로 인터페이스를 사용해야하는 상황을 발견합니다. 예를 들어 꼬리표 이러한 클래스가 XML 태그를 나타내는 데 사용되는 것을 식별하는 인터페이스 및 containAbleTag 특정 태그는 일부 태그의 어린이 태그 중 하나 일 수 있음을 지적합니다.

그런 다음이 페이지에 걸려 넘어집니다. http://xahlee.org/java-a-day/interface.html ( "레이블로 인터페이스"세션.). 말한다 :

문제의 요점은 그것이 언어에서 수학적 관련성이 있다는 것입니다. 소프트웨어 엔지니어링 관점의 가능한 이점을 위해 언어의 라벨링 메커니즘으로서 라벨링 개념과 프로그래밍 인터페이스의 개념은 의미 적으로 이질적이므로 클래스 인터페이스의 일부로 설계되어서는 안됩니다.

레이블로서 인터페이스가 반드시 나쁜 연습입니까? Java 프로그래머로서 다른 대안이 있습니까?

도움이 되었습니까?

해결책

마커가 Java 5 이상의 주석 메커니즘으로 대체 된 인터페이스는 크게 대체되었습니다. 그들은 당신이 임의의 메타 데이터를 추가 할 수 있습니다. 인터페이스가 비어 있고 클래스 마커 역할 만 사용하는 경우 대신 주석을 사용해야합니다.

다른 팁

주석은 마커 인터페이스에 대한 대안을 제공 할 수 있지만 Java에서만 사용할 수 있으며 IDE와 잘 통합되지 않습니다. 마커 인터페이스를 사용하여 프로젝트의 관련 개념을 태그로 연결 한 다음 유형 Hierarchy 브라우저를 사용할 수 있습니다. 모든 회원을 찾으십시오 (이것은 결국 주석을위한 주요 IDE에 의해 결국 지원 될 것 같습니다).

당신이 언급 한 기사의 경우, 클래스가 인터페이스를 구문 적으로/구조적으로 "충족"하는 경우 해당 인터페이스가 클래스에 자동으로 적용될 수 있다고 주장하는 요점은 보이지 않습니다 ( "모든 클래스는 [RandomAccess]를 선언 할 수 있습니다. 인터페이스 ... "). 제 생각에는 거꾸로 생각합니다.

나는 그러한 마커 인터페이스가 '인스턴스'진술에 사용되는 장소가 거꾸로 된 논리를 사용하지만 여러 상속, 측면 및 주석없이 언어 내에 붙어있는 한, 나는 달성 할 수있는 더 좋은 방법을 볼 수 없다고 주장합니다. 이것은 기본 언어에서 벗어나지 않고.

또한 항상 적용 가능한 빈 인터페이스에 대한이 데드 비트 논쟁은 주석에도 적용될 수 있습니다.

주석이 반드시 원하는 것은 아닙니다. 태깅 인터페이스는 유형 자체로 유형의 속성을 작동시키는 방법입니다. 예를 들어, 다음과 같이 보이는 코드를 작성하려는 경우 다음과 같습니다.

@interface ContainableTag{}

@ContainableTag public class Foo {}

// ... elsewhere...

/**
 * Adds obj as a child element.
 * @throws IllegalArgumentException if obj is not tagged with 
 *         the ContainableTag annotation.
 */
public void addElement(Object obj){
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class))
        throw new IllegalArgumentException("obj is not a ContainableTag");
    // add the containable tag as an element
}

그런 다음 이것이 더 좋아 보인다고 생각하지 않는다면 고려하십시오.

interface ContainableTag {}

public class Foo implements ContainableTag {}

// ... elsewhere...

public void addElement(ContainableTag ct){
    // add the containable tag as an element
}

물론 태깅 인터페이스는 유형 자체가 제공하는 동작에 대한 정보를 제공하지 않지만 하다 다른 유형 이이 비 행동 속성을 시행하도록 허용하십시오. 나는 확실히 많은 성가신 벌레를 아끼지 않았을 것이다. ObjectOutputStream a writeObject(Serializable) 방법보다는 writeObject(Object).

편집하다: 나는 가지고있다 중요하지 않은 지원 여기.

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