2008-10-16 2 views
3

Java 코드에서 데이터 액세스 객체 (DAO)를 정의 할 수있는 인터페이스가 있습니다. 대부분의 메소드는 DTO (Data Transfer Object)의 매개 변수를 사용합니다. 이 문제는 DAO의 구현이 특정 유형의 DTO를 참조해야 할 때 발생합니다. 그런 다음 메서드는 특정 DTO에 대한 DTO의 불필요한 캐스트를 수행해야합니다. 컴파일러는 DAO의 특정 구현에 대해 모든 유형의 유형을 검사 할 수 없습니다. . DTO들 내 질문은 : 나는 가장 작은 방식으로이 문제를 해결 어떻게인터페이스가 너무 일반적입니다.

답변

12

당신은 제네릭을 사용할 수 있습니다?

DAO<SpecificDTO> dao = new SpecificDAO(); 
dao.save(new SpecificDTO()); 
etc. 

당신의 DAO 클래스의 모습 :

interface DAO<T extends DTO> { 
    void save(T); 
} 

class SpecificDAO implements DAO<SpecificDTO> { 
    void save(SpecificDTO) { 
     // implementation. 
    } 
    // etc. 
} 

SpecificDTO 것 연장 또는 메신저 plement DTO.

+0

감사합니다. 처음에는 컴파일러를 사용하여 몇 가지 주장을 한 후에 완전히 이해할 수 없었습니다. –

0

제네릭에 리팩토링하면 통증이 거의 없습니다.

DTO user = userDAO.getById(45); 

((UserDTO)user).setEmail(newEmail) 

userDAO.update(user); 

난이 (훨씬 더 미묘한 방법으로) 다 봤어요 : 코드는 다음처럼 DTO 인터페이스를 사용하는 경우

특히 끔찍한 될 것입니다.

이 작업을 수행 할 수 있습니다 :

public DeprecatedDAO implements DAO 
{ 
    public void save(DTO dto) 
    { 
     logger.warn("Use type-specific calls from now on", new Exception()); 
    } 
} 

public UserDAO extends DeprecatedDAO 
{ 
    @Deprecated 
    public void save(DTO dto) 
    { 
     super.save(dto); 
     save((UserDTO)dto); 
    } 

    public void save(UserDTO dto) 
    { 
     // do whatever you do to save the object 
    } 
} 

을 이것은 솔루션이 아니라 쉽게 구현할 수 있습니다; 레거시 코드는 여전히 작동해야하지만, 경고를 생성하고 추적을 스택하여 사냥을 돕고, 유형 안전 구현도합니다.

관련 문제