2010-05-03 6 views
1

많은 공통된 동작을 공유하는 클래스 집합을 만들고 싶습니다. 물론 OOP에서 "서브 클래스가있는 추상 클래스"를 자동으로 생각한다고 생각할 때. 하지만이 클래스에서 수행해야하는 작업 중에는 각각 클래스의 인스턴스에 대한 정적 목록이 있어야합니다. 목록은 클래스 내에서 싱글 톤의 일종으로 작동해야합니다. 나는 각각의 서브 클래스가 싱글 톤을 가지고 있다는 것을 의미한다. "싱글 톤"을 서브 클래스로, 진정한 싱글 톤이 아닙니다. 하지만 정적 인 경우 어떻게 상속받을 수 있습니까? 각 서브 클래스에 대한 목록의싱글 톤 제품군을 만들려면 어떻게해야합니까?

public abstract A 
{ 
    static List<A> myList; 
    public static List getList() 
    { 
    if (myList==null) 
     myList=new ArrayList<A>(10); 
    return myList; 
    } 
    public static A getSomethingFromList() 
    { 
    List listInstance=getList(); 
    ... do stuff with list ... 
    } 
    public int getSomethingFromA() 
    { 
    ... regular code acting against current instance ... 
    } 
} 
public class A1 extends A 
{ 
    ... 
} 
public class A2 extends A 
{ 
    ... 
} 

A1 somethingfromA1List=(A1) A1.getSomethingFromList(); 
A2 somethingfromA2List=(A2) A2.getSomethingFromList(); 

내용은 다를 것이지만, 모든 코드가 같은 것 목록에서 작동하는이 같은

물론 코드가 작동하지 않습니다.

위의 코드의 문제점은 모든 하위 클래스에 대해 하나의 목록 만 가질 수 있다는 것이고 각각에 대해 하나씩 필요하다는 것입니다. 예, 각 하위 클래스에 정적 목록을 선언하는 코드를 복제 할 수 있지만 목록에 추가하고 목록 등을 검색하는 모든 코드를 복제해야합니다. 그러면 서브 클래 싱의 목적을 상실하게됩니다.

코드를 복제하지 않고이를 수행하는 방법에 대한 아이디어가 있으십니까?

업데이트

는 BlueRaja 아마도 다른 사람을 위해 명확하게 제가 할 노력하고있어에 대해 좀 더 구체적으로 보자합니다.

비슷한 동작이 필요한 상태 및 코드가 여러 개 있습니다. 그들은 가능한 모든 코드 상태에 대해 유형 안전 인스턴스를 원한다는 점에서 열거 형과 비슷하지만 여러 세트로되어 있으므로 모든 열거 형을 열거 할 수는 없습니다.

예를 들어, 주문 상태, 배송, 수신 및 일부 특수 값이있는 주문 상태가 있습니다. 상품 대 서비스의 가치가있는 항목 유형이 있습니다. 주문 대비 재고가 있습니다. 기타

그게 전부라면 나는 각각에 대한 열거 형을 만들거야. 그러나 텍스트 값으로 객체를 검색하는 기능과 같이 필요한 다른 동작이 있습니다 (예 : 우리가 데이터베이스에서 그것을 읽을 때; 텍스트 설명으로 모든 선택 사항을 나열한 드롭 다운을 작성합니다. 내가 아는 한 최선을 다해 상속하고 싶은 공통적 인 동작을 가진 코드 집합이 여러 개 있고 열거 형을 서브 클래스로 만들 수 없기 때문에 열거 형으로이 작업을 수행 할 수 없습니다. 모든 코드를 단일 열거 형에 넣으면 특정 코드 유형에 대한 값 목록을 수집 할 준비가되지 않았을뿐만 아니라 한 코드에서 다른 코드로 형식 안전성을 포기하게됩니다.

+2

개체 orietented 세계에서 상태를 보유하고 정적을 사용하지 마십시오. 단지 잘못되었습니다. –

+2

싱글 톤을 사용하지 마십시오. 정적 데이터에 매우주의하십시오. 상속 이상의 구성을 선호합니다. 정말로, 당신이 언급하는 거의 아무것도 "좋은 OOP"가 아닙니다. – jalf

+0

오케이. 그래서 주어진 하위 클래스의 인스턴스 세트가 있고, 검색, 드롭 다운 작성 등에 대한 모든 인스턴스 목록을 유지해야합니다. 좋아요, 목록을 보유하고있는 (정적이 아닌) 객체를 만들 수 있습니다. 그러나 하나의 목록 만 존재하는 것이 타당합니다. 그래서 이점은 무엇입니까? 다른 목록을 가진 두 개의 객체를 만들면 잘못된 것이 있습니다. 싱글 톤없이 어떻게 문제를 해결하겠습니까? – Jay

답변

5

상위 클래스에서 static Map<Class, YourClass> = new ConcurrentHashMap<..>()을 사용하고 해당 맵을 사용하여 인스턴스를 추가/검색 할 수 있습니다.

싱글 톤에 대한 이와 같은 큰 의존도는 나에게 나쁜 디자인처럼 들리지만이를 피하려고 노력해야합니다.

+0

catch는 다음과 같습니다. 서브 클래스의 정적 요소가 HashMap에서 적절한 항목을 가져올 수 있습니까? 이 작업을 수행하는 유일한 방법은 정적 클래스를 수퍼 클래스에두고 클래스 이름을 "A1 a1 = (A1) A.getSomethingFromA (A1.class)"와 같은 매개 변수로 전달하는 것입니다. 할 수 있지만 조금 어색함. 더 쉬운 방법을 염두에 두시겠습니까? – Jay

1

What is so bad about singletons?

편집 : 질문 응답 후 : - 나에게, "서브 클래스와 추상 클래스를 제안하지 않는 것을 당신은"나는 일반적인 행동을 많이 공유 클래스 집합을 만들려면 "라고 전혀 ", 추상적 인 클래스는 아무런 행동을하지 않기 때문에. 이것은 공통적 인 동작을 구현하는 별도의 객체와 그 개별 객체를 모으는 많은 클래스를 제안합니다.

+0

오케이. 그렇다면 싱글 톤없이 어떻게 문제를 해결할 수 있을까요? – Jay

+0

당신은 "공통된 행동을 많이 공유하는 클래스 세트를 만들고 싶습니다."라고 말합니다. 추상적 클래스는 아무런 행동을하지 않기 때문에, "나에게 * 서브 클래스가있는 추상 클래스"를 제안하지 * 않습니다. 이것은 공통적 인 동작을 구현하는 별도의 객체와 그 개별 객체를 모으는 많은 클래스를 제안합니다. –

0

소리를 통해 사용자 정의 속성이있는 enum 클래스와 behaviours이 실제로 필요합니다.자바에서 열거 형의 강력한 힘의 예제는 here을 참조하십시오.

+0

네, 원하는 것은 정교한 enum과 같은 것입니다. 그러나 나는 같은 정교함을 가진 수십 개의 수업을 원한다. 내 지식으로는 열거 형을 서브 클래스화할 수 없습니다. 그래서 네, 동일한 코드를 가진 열거 형의 전체 묶음을 만들어 이것을 수행 할 수 있습니다. 그러나 복사 및 붙여 넣기 코드는 유지 관리의 악몽입니다. 열거 형을 서브 클래 싱하는 방법이 없다면, 여기서는 저를 대신해서 열거하지 않을 것입니다. – Jay

+0

@Jay : 아니요, 단일 * 열거 형 클래스가 필요합니다. 하위 클래스 화가 필요하지 않습니다. 지금 당신이 클래스를 사용하고있는 각각의 것은 사실 enum 값이 될 것입니다. 각 "클래스"에 대한 사용자 정의 동작은 실제로 각 열거 형 값에 특정한 추상 열거 형 메서드의 구현입니다. 공유되는 모든 것은 단순히 다른 클래스와 마찬가지로 열거 형의 일부가됩니다. 여기에는 복사/붙여 넣기가 포함되지 않습니다. 설명하는 상황은 Java의 강력한 열거 형에 대한 것입니다. –

+0

내 생각을 오해하고있는 것 같아. (또는 나는 당신을 오해하고 있습니다.) 원래의 질문을 좀 더 구체적으로 업데이트하고 있습니다. 아마도 이것이 명확해질 것입니다. – Jay

0

난 공장 방법을 생각하고있을 것입니다 :

public class Factory { 
    private static final A1 a1Instance = new A1(
      Collections.synchronizedList(new ArrayList<something>(100))); 
    private static final A2 a2Instance = new A2(
      Collections.synchronizedList(new ArrayList<something>(100))); 

    public static A getA1() { return a1Instance; } 
    public static A getA2() { return a2Instance; } 
} 

귀하 A는 더 이상 물론 모든 static 방법이 필요하지 않을 것입니다.

0

당신은 클래스의 색인을 사용할 수 있습니다, 정적 목록은 단지 코러스와 하위 클래스의 이러한 클래스의 instace를 참조하는 색인을 사용할 수 있습니다 필요가 없습니다. 는 여기 excample입니다 : 당신이 싱글의 기능을 필요로하고 동시에 당신이 의존성 주입 프레임 워크와 같은 또는 PicoContainer을 고려해야 상속의 혜택을 얻고 싶은 경우에 http://www.java2s.com/Code/CSharp/Class-Interface/Indexerallowarraylikeindex.htm

0

. 응용 프로그램이 아주 작은 경우에도 종속성을 관리하는 프레임 워크를 사용하면 여전히 쉽게 사용할 수 있습니다.