2012-09-19 4 views
0

많은 DAO에서 동일한 코드를 사용하지 않도록 일반적인 DAO를 만들려고합니다.제네릭 클래스의 여러 인스턴스

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class); 
private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class); 

첫번째는 제외 될 것 같다

내 문제는 다음 코드 줄 것입니다.

BaseDAOImpl의 발췌 :

public class BaseDAOImpl<T> implements BaseDAO<T> { 

    private Class<T> entity; 
    private DAOFactory daoFactory = Config.getInstance().getDAOFactory(); 
    private static String SQL_FIND_BY_ID; 

    public BaseDAOImpl(Class entity) { 
     this.entity = entity; 
     SQL_FIND_BY_ID = "SELECT * FROM VIEW_" + entity.getSimpleName() + " WHERE id = ?";   
    } 
} 

가 이런 식으로 여러 개체를 인스턴스화 할 수 없습니다?

+1

정확히 무엇이 잘못 되었나요? 예상 된 결과를 내지 않는 코드를 제공 할 수 있습니까? – sji

+0

나에게 괜찮은 것 같아, 다이아몬드 연산자는 JDK7에서 괜찮아. +1 sji - 무슨 일이야? – Faelkle

답변

1

예. "처음은 건너 뛰는 것 같다"는 말의 의미가 명확하지 않습니다. 하지만 "SQL_FIND_BY_ID"에 대해 정적 값을 사용하고있을 수 있습니까?

private BaseDAOImpl<Artist> baseDAOArtist = new BaseDAOImpl<>(Artist.class); 

두 개의 인스턴스 변수를 생성 한 후 SQL_FIND_BY_ID의 값을 설정합니다 :

private BaseDAOImpl<ArtistRelation> baseDAOArtistRelation = new BaseDAOImpl<>(ArtistRelation.class); 

두 개의 새로운 인스턴스 변수를 만들고 두 인스턴스의 값 "SQL_FIND_BY_ID"로 변경됩니다 순간으로. 오류 내가 더 많거나 적은 지금 추측하지만, 변수 이름에서 판단하고 나는 정적 필드 SQL_FIND_BY_ID을 의심 할 것 코드가 원인으로 오전에 대한 자세한 설명없이

+0

정말 고마워요! 나는 방금 제네릭을 사용하기 시작했고 그것이 이상한 무언가라고 생각했다. 내 실수를 지적 해 주셔서 감사합니다, 지금 작동합니다! – nivis

+0

@nivis 환영합니다 :) –

0

.

두 DAO를 인스턴스화하면 BaseDAOImpl 생성자의 두 번째 실행은 정적 필드의 값을 덮어 씁니다. DAO가 거기에 저장된 SQL 쿼리에 의존하면 항상 인스턴스화 된 DAO의 엔티티를 쿼리합니다.

정적 필드와 메서드는 일반 매개 변수가 다른 경우에도 클래스의 모든 인스턴스간에 공유됩니다. 예를 들어 C++의 템플릿에서는 각 generic 매개 변수에 대해 별도의 클래스가 생성되지 않습니다.

각 엔터티에 대해 별도의 쿼리를 수행하려면 정적 필드를 비 정적 멤버로 변경할 수 있습니다.

+0

예, 완전히 옳습니다. 위의 크리스에 대한 대답으로 내가 말했듯이; 방금 제네릭을 사용하기 시작했고 그 문제가 제한된 지식으로 인해야만했음을 확신했습니다. 나는 정적 필드를 완전히 놓쳤다. 제 문제의 원인을 찾고 유익한 답변을 작성해 주셔서 대단히 감사합니다! – nivis

관련 문제