나는 지속성을 위해 Hibernate를 사용합니다.Java Hibernate : 캐스팅 제거에 더 좋은 디자인은 무엇입니까
본인은 문서에 대한 정보와 문서를 생성하는 데 필요한 정보 (인쇄 또는 이메일로 보내기)가있는 엔티티가 있다고 가정합니다. 그냥 같이 :
문제는 여기에 DocumentInformation이 아닌 서브 클래스 DocumentPrintConfiguration 또는 DocumentEmailConfiguration에 추상 클래스 DocumentProductionConfiguration 참조를 보유하고 있다는 점이다.
실제로 적절한 구성을 얻으려면 instanceof + casting을 사용하거나 방문객 패턴을 사용하여 Java를 트릭하여 런타임에서 실제로 처리중인 구성을 이해할 수 있도록하십시오.
사용하여 주조 :
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.... } }
사용 방문자 패턴 : 나는이 두 가지 모두를
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를 유지해야합니다 ...).
이 의미에서 두 번째는 더 좋습니다. 일단 새로운 구성을 추가하면 컴파일러가 프로세스를 안내합니다. 먼저 구성 자체에 적합한 메소드를 구현 한 다음 모든 방문자 클래스에서 적절한 메소드를 구현해야합니다. 반면에 기본적으로 서비스를 전달하는 것은 매우 어색합니다 ...
그래서 나는 문제보다는 증상을 치료하고있는 것처럼 느낍니다. 어쩌면 디자인 자체에 약간의 변화가 필요할까요? 하지만 어떻게 향상시킬 수 있을지 모르겠다. ...
불행히도 문제는 다음과 같습니다. java를 사용합니다. Java는 완벽한 언어와는 거리가 멀며 때때로 언젠가는 더러운 트릭을 사용해야합니다. – talex
나는 그런 쓸데없는 것들에 대해 생각하지 않고 모든 것을 완전히 추상화 할 라이브러리를 사용할 것이다. 필자는'objectMapper.toXML (myDocumentInformation); '(예를 들어)로 끝나고 더 중요한 디자인 문제에 집중할 수 있습니다. – Kayaman