2011-08-22 6 views
11

공식화 된대로 부적절한 것인지 알려주십시오 (특히 Programmers.SE 또는 그 밖의 것이 더 나은지 여부).효과적인 Java 특성을 달성하는 방법은 무엇입니까?

좋아요. 그래서 저는 현재 인터페이스로 표현하고있는 많은 '특성'을 가지고 있습니다. 그것들을 "업데이트 가능"하고 "파괴 가능"이라고합시다. 인터페이스로 표현하면 모든 "파괴 가능한"구성 요소간에 동작을 공유 할 수 없다는 단점이 있습니다. 반면에 이들을 추상 클래스로 표현한다는 것은 혼합 된 형질을 다른 추상 클래스 ("UpdateableAndDestructible")로 명시 적으로 정의하지 않고서도 혼합 및 일치시킬 수 없다는 것을 의미하며, 그 시점에서 추상 클래스 기능의 남용과 같은 느낌을줍니다. 그러나 이것을 처리하는 더 깨끗한 방법이 없다면 아마도 내가 끝낼 것입니다.

이 수수께끼에 대한 순수한 자바 솔루션에 대한 내 선택은 무엇입니까? 내가 사용하고있는 모든 순열을 명시 적으로 기술 할 필요없이 적합하다고 생각하는대로 믹싱하고 매칭 할 수 있습니까?

+2

을 당신은 descibing 있습니다 * 유지 mixin *을 - 즉 유용한 용어 수 있습니다 당신이 일을하는 경우 수색. – Jesper

답변

6

아마도 인터페이스와 기본 구현을 혼합하여 목표를 달성 할 수 있습니다.

처럼 :

public interface Updatable { 
    void updated(); 
} 

public interface Loadable { 
    void load(); 
} 

public class DefaultUpdatable implements Updatable { 
... 
} 

public class DefaultLoadable implements Loadable { 
... 
} 

public class SomeObject implements Updatable, Loadable { 
    private final Updatable updatable = new DefaultUpdatable(); 
    private final Loadable loadable = new DefaultLoadable(); 

    public void load() { 
    this.loadable.load(); 
    } 

    public void updated() { 
    this.updatable.updated(); 
    } 
} 

여전히 잡음이 어쩌면 유연하지 당신이 좋아하는 것처럼하지만 어쩌면 UpdatableAndDestructable 일을하는 것보다 조금 청소기.

+0

+1하고 받아 들였을 때이 방법을 사용하면 문제를 해결할 수 있습니다. (이 문제를 조사하는 동안 Guice와 같은 유용한 프레임 워크를 발견했기 때문에 이러한 종류의 로직을 사용하는 것이 다소 어려워졌습니다.) –

4

당신이 "순수 자바"라고 말한 것을 알고 있지만 이것은 무언가입니다. Scala은 잘합니다. 자바 언어 자체의 한계는 사람들이 다른 JVM 언어를 채택 할 수있는 강력한 동인입니다 ...

+0

이 제안에 감사드립니다. –

5

나는이 문제에 대한 꽤 해결책이 없다고 생각하지만, 어쩌면 보일러 판을 얼마나 경멸 하느냐에 따라 몇 가지 유용한 해결책이 있다고 생각한다.

특성을 첫 번째 매개 변수로 인스턴스 개체를 사용하는 다른 클래스 + 인터페이스로 정의 할 수 있습니다. 그리고 그들은 당신이 특성을 갖고 싶어하는 클래스와 인터페이스를 구현합니다. 그런 다음 특성 impl의 메소드를 호출하는 스텁 메소드를 작성하십시오.

public class MyClass implements MyTrait { 
    @Override 
    public void doSomething() { 
     MyTraitImpl.doSomething(this); 
    } 
} 

그리고 그 특성 자체 :

public interface MyTrait { 
    public void doSomething(); 
} 

public class MyTraitImpl { 
    public static void doSomething(MyTrait obj) { 
     // do something with obj 
    } 
} 

어니스트 프리드먼 - 힐, 스칼라 (나는 그것을 이해,이는 JVM에 특성을 구현하는 방법입니다) 당신을 위해이 작업을 수행 그래도 말처럼 .

당신이 lombok 같은 순수 자바를 사용하여 고려하는 경우
1

,이 같은 @Delegate를 사용하여 당신의 인생을 단순화 수 :

public class SomeObject implements Updatable, Loadable { 
    @Delegate private final Updatable updatable = new DefaultUpdatable(); 
    @Delegate private final Loadable loadable = new DefaultLoadable(); 
} 
관련 문제