2009-03-02 7 views
4

나는 Collections를 통해 sifting하는 데 사용되는 Predicate라는 인터페이스를 사용하고 있습니다. 예를 들어, 나는Java : 싱글 톤 및 제네릭을 사용하는 디자인

내 질문은 이것이다 등,

public class BlackCatPredicate implements Predicate<Cat> { 
    public boolean evaluate(Cat c) { 
     return c.isBlack(); 
    } 
} 

을 정의하고 고양이의 컬렉션에 술어를 적용하는 몇 가지 유틸리티를 findAll(Collection<T> coll, Predicate<T> pred) 방법을 사용, 그냥 검은 사람을 얻을 수 있습니다 : 나 ' 내 코드 전체에서 검은 고양이를 찾는다면, BlackCatPredicate를 반복해서 계속 인스턴스화 할 필요가 없습니다. 인스턴스가 하나만 있어야합니다. 그렇지만 많은 술어를 작성하는 과정에서 각자를 싱글 톤으로 구현하고 싶지는 않습니다. 그래서 여기에 적절한 디자인이 무엇입니까?

답변

12

나는 상수 익명 클래스를 사용하는 것과가 운영하는 클래스를 넣어 : 술어가 매개 변수가

public class Cat{ 
    public static final Predicate<Cat> BLACK_PREDICATE = new Predicate<Cat>(){ 
      public boolean evaluate(Cat c) { 
       return c.isBlack(); 
      } 
     }; 

    // Rest of the Cat class goes here 
} 

경우, 당신이 할 수있는 정적 팩토리 메소드를 사용하십시오.

편집 : 바와 같이, 코멘트에 지적 사용 패턴에 따라 한, 그것은 별도의 클래스에서 술어 상수 (및/또는 팩토리 메소드)를 수집하는 명확한 코드가 발생할 수 있습니다 중 유일한 고양이에 대한 그 , 또는 모두. 주로 조직의 숫자에 따라 조직이 얼마나 도움이되는지에 따라 다릅니다.

+0

나는 Cat 자체가 아니라 "Cats"클래스를 넣을 것입니다. –

1

모든 조건자를 유형 arg로 취하고 주어진 조건 자 유형에 대해 단일 인스턴스를 생성하는 일반 팩토리를 만들 수 있습니다.

더 일반적인 접근 방법은 의존성 주입 라이브러리를 사용하는 것입니다. 그리고 그것을 통해 모든 객체 생성을 수행하십시오. 일반적으로 유형을 작은 단위로 싱글 톤 (적절한 경우)으로 전환 할 수 있습니다.

3

이런 식으로 뭔가 작업을해야합니다 :

class Predicates 
{ 
    private static class BlackCatPredicate implements Predicate<Cat> 
    { 
     public boolean evaluate(final Cat c) 
     { 
      return c.isBlack(); 
     } 
    } 

    private static final BlackCatPredicate = new BlackCatPredicate(); 


    public static Predicate<Cat> getBlackCatPredicate() 
    { 
     return (blackCatPredicate); 
    } 
} 
+0

getBlackCatPredicate 술어 또는 BlackCatPredicate에 대한 반환 유형? 어느 쪽이 더 좋아 보이는가? – extraneon

+0

죄송합니다 ... 전 프레디 티브 을 반환합니다. – TofuBeer

0

BlackCatPredicate 인스턴스를 추가로 만들지 않아도됩니다.

여기 저기에 new BlackCatPredicate()을 쓰고 싶지 않다면 확실히 정적 팩토리 메서드를 추가하여 BlackCatPredicate.getInstance() 대신 쓸 수 있습니다. 또 다른 옵션은 별도의 클래스를 작성하여 CatPredicates.getBlackCatPredicateInstance()을 작성할 수 있도록하는 것입니다.

그러나 이것은 클라이언트 코드에서 술어 작성을 추상화하기위한 것일 뿐이며 실제 오브젝트 작성과 관련이 없습니다. 수명이 짧은 객체를 다루는 것은 JVM이 가장 잘하는 것 중 하나이기 때문에 여분의 BlackCatPredicate 인스턴스를 여러 개 만들고 즉시 삭제해도 성능에는 아무런 영향이 없습니다.