Java : 싱글 톤과 제네릭이있는 디자인
문제
컬렉션을 살펴 보는 데 사용되는 술어라는 인터페이스를 사용하고 있습니다. 예를 들어 정의 할 수 있습니다
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
인스턴스와 버려지는 것은 즉시 성능에 약간의 영향을 미치지 않습니다.