2016-11-18 2 views
1

나는 지속성을 위해 Hibernate를 사용합니다.Java Hibernate : 캐스팅 제거에 더 좋은 디자인은 무엇입니까

본인은 문서에 대한 정보와 문서를 생성하는 데 필요한 정보 (인쇄 또는 이메일로 보내기)가있는 엔티티가 있다고 가정합니다. 그냥 같이 : enter image description here

문제는 여기에 DocumentInformation이 아닌 서브 클래스 DocumentPrintConfiguration 또는 DocumentEmailConfiguration에 추상 클래스 DocumentProductionConfiguration 참조를 보유하고 있다는 점이다.

실제로 적절한 구성을 얻으려면 instanceof + casting을 사용하거나 방문객 패턴을 사용하여 Java를 트릭하여 런타임에서 실제로 처리중인 구성을 이해할 수 있도록하십시오.

  1. 사용하여 주조 :

    public class XmlBuilder{ 
    public XMLMessage buildXmlMessage(DocumentInformation documentInformation){ 
        if(documentInformation.getDocumentProductionConfiguration() instanceOf DocumentPrintConfiguration){ 
         DocumentPrintConfiguration printConfig = (DocumentPrintConfiguration) documentInformation.getDocumentProductionConfiguration(); 
         XMLMessageConfig xmlConfig = handlePrintConfig(printConfig); 
        } 
    } 
    public XMLMessageConfig handlePrintConfig(DocumentPrintConfiguration printConfig){ 
        ....build that XMLMessageConfig.... 
    } 
    } 
    
  2. 사용 방문자 패턴 : 나는이 두 가지 모두를

    public interface XmlBuilderVisitor<T> { 
        T handlePrintConfig(DocumentPrintConfiguration printConfig); 
    } 
    public class XmlBuilder implements XmlBuilderVisitor<XMLMessageConfig> { 
        @Override 
        public XMLMessageConfig handlePrintConfig(DocumentPrintConfiguration printConfig){ 
         ....build that XMLMessageConfig.... 
        } 
        public XMLMessage buildXmlMessage(DocumentInformation documentInformation){ 
         XMLMessageConfig xmlMessageConfig = documentInformation.getDocumentProductionConfiguration().buildConfiguration(this); 
        } 
    } 
    public abstract class DocumentProductionConfiguration{ 
        public abstract <T> T buildConfiguration(XmlBuilderVisitor<T> visitor); 
    } 
    public class DocumentPrintConfiguration extends DocumentProductionConfiguration{ 
        public <T> T buildConfiguration(XmlBuilderVisitor<T> visitor){ 
         return visitor.handlePrintConfig(this); 
        } 
    } 
    

    을 구현하기 위해 XmlBuilder을위한 새로운 인터페이스를 추가 할 필요가

솔루션은 좀 이상하다. 첫 번째 원칙은 공개 된 원칙을 위반하기 때문입니다 (나는 항상이 ifs를 유지해야합니다 ...).

이 의미에서 두 번째는 더 좋습니다. 일단 새로운 구성을 추가하면 컴파일러가 프로세스를 안내합니다. 먼저 구성 자체에 적합한 메소드를 구현 한 다음 모든 방문자 클래스에서 적절한 메소드를 구현해야합니다. 반면에 기본적으로 서비스를 전달하는 것은 매우 어색합니다 ...

그래서 나는 문제보다는 증상을 치료하고있는 것처럼 느낍니다. 어쩌면 디자인 자체에 약간의 변화가 필요할까요? 하지만 어떻게 향상시킬 수 있을지 모르겠다. ...

+1

불행히도 문제는 다음과 같습니다. java를 사용합니다. Java는 완벽한 언어와는 거리가 멀며 때때로 언젠가는 더러운 트릭을 사용해야합니다. – talex

+2

나는 그런 쓸데없는 것들에 대해 생각하지 않고 모든 것을 완전히 추상화 할 라이브러리를 사용할 것이다. 필자는'objectMapper.toXML (myDocumentInformation); '(예를 들어)로 끝나고 더 중요한 디자인 문제에 집중할 수 있습니다. – Kayaman

답변

0

"handle"기능을 DocumentProductionConfiguration 및 하위 클래스로 푸시하는 것이 좋습니다. 따라서 DocumentPrintConfiguration에는 handle 함수가 포함되어 있으며이 함수는 빌드하고 XMLMessageConfig을 반환합니다. 그런 다음 XmlBuilder가됩니다.

public class XmlBuilder{ 
    public XMLMessage buildXmlMessage(DocumentInformation documentInformation){ 
     XMLMessageConfig xmlConfig = documentInformation.getDocumentProductionConfiguration().handle(); 
    } 
} 
관련 문제