문제

컬렉션을 살펴 보는 데 사용되는 술어라는 인터페이스를 사용하고 있습니다. 예를 들어 정의 할 수 있습니다

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

그런 다음 일부 유틸리티를 사용하십시오 findAll( Collection<T> coll, Predicate<T> pred) 술어를 고양이 모음에 적용하고 검은 색 등을 얻는 방법.

내 질문은 이것입니다 : 나는 코드 전체에서 검은 고양이를 찾고 있으므로 BlackCatpredicate를 계속해서 계속 인스턴스화 할 필요가 없습니다. 하나의 인스턴스 만 있어야합니다. (싱글 톤?) 그러나 많은 곤경을 쓰는 과정에서 나는 각각을 싱글 톤으로 구현하고 싶지 않습니다. 그래서 - 여기에 적절한 디자인은 무엇입니까?

도움이 되었습니까?

해결책

익명의 클래스 상수를 사용하여 작동하는 클래스와 함께 사용합니다.

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
}

술어에 매개 변수가있는 경우 정적 공장 방법을 사용할 수 있습니다.

편집하다: 주석에서 지적한 바와 같이, 사용 패턴에 따라, 이는 CAT 또는 이들 모두를위한 별도의 클래스에서만 술어 상수 (및/또는 공장 방법)를 수집하기위한 명확한 코드를 초래할 수 있습니다. 그것은 주로 그들의 수에 달려 있으며, 추가 조직이 얼마나 도움이되는지에 따라 다릅니다.

다른 팁

이와 같은 것이 효과가 있어야합니다.

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);
    }
}

유형 인 Arg로 술어를 취한 일반적인 공장을 만들 수있는 다음 주어진 술어 유형에 대해 단일 인스턴스를 생성 할 수 있습니다.

또 다른 일반적인 접근 방식은 종속성 주입 라이브러리를 사용하기 시작하고이를 통해 모든 객체 생성을 수행하는 것입니다. 일반적으로 유형을 적절한 경우 거의 변경되지 않으면 유형을 싱글 톤으로 전환 할 수 있습니다.

추가 생성에 대해 걱정하지 않을 것입니다 BlackCatPredicate 전혀 인스턴스.

글쓰기를 좋아하지 않는다면 new BlackCatPredicate() 모든 곳에서 정적 공장 방법을 추가하여 쓸 수 있습니다. BlackCatPredicate.getInstance() 대신에. 또 다른 옵션은 별도의 수업을 작성하여 쓸 수있는 것입니다. CatPredicates.getBlackCatPredicateInstance().

그러나 이것은 클라이언트 코드에서 술어의 생성을 추상화하기위한 것입니다. 실제 객체 생성과 관련이 없습니다. 짧은 개체를 다루는 것은 JVM이 가장 잘하는 것 중 하나이므로 추가 묶음을 만듭니다. BlackCatPredicate 인스턴스와 버려지는 것은 즉시 성능에 약간의 영향을 미치지 않습니다.

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