잘못된 단어를 사용했을 수 있으므로 비즈니스 개체 (BO)를 말할 때 최대 절전 모드를 사용하는 데이터베이스 테이블에 매핑 된 클래스에 대한 참조가있는 클래스를 의미합니다 비즈니스 로직으로서.최대 절전 모드, 하위 클래스 및 방문객 패턴
내가 직면 한 문제는 반사 또는 instanceof를 사용하지 않고 하위 클래스에 적합한 BO를 인스턴스화하는 것입니다.
예를 들어 Animal-table에 대한 하나의 참조가있는 Pen-table이 있는데, Cat 테이블과 Dog 테이블 (모두 일대일 참조)이 있습니다. 클래스는 다음과 같이 다소 찾습니다
Pen p = ... // Get or load from database
PenBO pbo = new PenBO();
pbo.setPen(p);
그런 다음 나는이 같은 클래스를 사용합니다 :
public class Pen {
private Animal a;
// Getters and setters
}
public class Animal {
// Getters and setters
}
public class Dog extends Animal {
// Getters and setters
}
public class Cat extends Animal {
// Getters and setters
}
public class PenBO {
private Pen p;
public AnimalBO getAnimalBO() { ... }
}
public interface Action {
void visit(DogBO dbo);
void visit(CatBO cbo);
}
public class Sound implements Action {
void visit(DogBO dbo) { ... }
void visit(CatBO cbo) { ... }
}
public interface AnimalBO {
void accept(Sound s);
}
public class DogBO implements AnimalBO {
Dog d;
void accept(Sound s) {
s.visit(this);
}
}
public class CatBO implements AnimalBO {
Cat c;
void accept(Sound s) {
s.visit(this);
}
}
그럼 난 그냥 보스는 보스의 수-방법 안에이처럼 인스턴스화 작업
pbo.getAnimalBO().accept(new Sound());
내가 작업하고있는 getAnimalBO 메소드입니다. 펜의 Animal-instance를 기반으로 BO의 올바른 인스턴스를 반환하고 싶습니다.
"현재 펜의 실제 동물에 대해 instanceof 확인을 사용할 수는 있지만 분명히 좋지는 않습니다. 내가 생각했던 또 다른 대안은 리플렉션을 사용하여 클래스 이름을 얻은 다음 나중에 "BO"를 추가하고 그 인스턴스를 얻는 것이었지만, 또한 꽤 추악합니다.
getAnimalBO 주위에 다른 visitor-pattern을 래핑하려고했지만 캐스팅하지 않고 올바른 visit-method를 선택할 수없고 non-BO 클래스에 accept-methods를 추가하고 싶지 않습니다.
그 방법을 효율적으로 작동시킬 수있는 영리한 방법이 없다면 핵심 문제일까요? 나는 Hibernate에 대한 모범 사례를 찾지 못했다. Hibernate와 visitor 패턴의 몇 가지 예제는 좋은 방법이 될 수없는 매핑 된 클래스에 accept-methods를 추가하기 만하면된다 ...
답변 해 주셔서 감사합니다. 나는 instanceof 또는 relfection과 함께 가고 싶지 않은 이유를 제공하지 못해 죄송합니다. 새로운 클래스를 추가하거나 새로운 클래스에 "BO"가 필요하다는 메모를 남겨 두어야 할 때 업데이트 할 장소가 더 필요했습니다. 나는 당신이 매핑 된 클래스에서 accept 메소드를 사용하는 것에 대해 좋은 점을 알았고 아마 그것과 함께 갈 것이라고 생각합니다. 매핑 된 클래스에 getter 및 setter 외에 다른 BO 클래스를 만들고 모든 새 Animal 하위 클래스에 instanceof를 추가하는 것만 큼 많은 부담을 느끼지는 않습니다. – user1540134