2013-06-05 4 views
4

java에서 데이터베이스 테이블의 클래스 표현을 만들고 싶습니다. 컬럼은 가능한 모든 다른 데이터 유형을 처리 할 수 ​​있도록 일반 클래스로 설계되었습니다.Java에서 동일한 일반 arraylist에 다른 매개 변수화 된 유형 저장

public class TableColumn<T> { 
    ... 
} 

테이블은 0을 가지고 ... N TableColumns가, 나의 테이블 클래스는 그 모습 않습니다

public class Table { 
    protected ArrayList<TableColumn<T>> columns = 
       new ArrayList<TableColumn<T>>(); 
    ... 
} 

아이디어는 다음과 같은 방법으로 열을 추가하는 것입니다.

Table t = new Table(); 
t.addColumn(String.class); 
t.addColumn(Integer.class); 
t.addColumn(Date.class); 
t.addColumn(String.class); 

그리고 나는 다음과 같은 방법으로 데이터를 조작 할 수 있습니다 :

String a = t.Cols(2).Row(3); 
t.Col(2).Row(3) = "b"; 

을하지만 난 내 문제는의 열을 구현하는 방법입니다 ... 그 achiving 내 현재의 방법과 형식 추구한다을 잃어버린하고 잠재적 인 다른 데이터 유형 열을 얻을 수 있습니다.

실마리가 있습니까?

+0

그래서'col (2)'가'col (3)'과 다른 유형이되기를 원하십니까? 그건 불가능하다. 간단하게 타입 체크가 컴파일 타임에 일어나기 때문에, 그리고 * value * 파라미터는 그것들에 아무런 영향을 미치지 않습니다. –

+0

이렇게하는 다른 가능한 방법이 있습니까? 또 다른 개념은 또 다른 구조입니까? –

+0

' T get()'메소드를'T '로 캐스트하면 위조 * 할 수 있습니다. 그러면'String x = foo.get()'과'Integer x = foo.get()'을 컴파일 할 수 있습니다. 그러나 이것은 또한 단점입니다 : 모든 컴파일 타임 타입 검사를 잃게됩니다.런타임시 오류가 발생하면 충돌 및 중지됩니다. –

답변

0

제한된 수의 유형 조합이있는 경우 해당 조합으로 인터페이스를 사용할 수 있습니다. 이렇게하면 열을 같은 방식으로 저장할 수 있으며 특별한 캐스팅이 필요하지 않습니다.

t.addColumn(MyInterface.class); 

여전히 당신이 원하는 것만 큼 깨끗하지만 종류의 피할하지 않을 것입니다 또 다른 방법은, 당신이 주조 및 유형의 일부 부담을 할 수있는 새로운 클래스를 사용하는 것입니다 체크 아웃.

예 : 단지 당신이 각 테이블에 다른 개체를 만들 수 없습니다 왜

public static class MyWrapper{ 
    Class<?>[] validPossibleClasses; 
    Object o; 
    public MyWrapper(Class<?> ...classes){ 
     this.validPossibleClasses = classes; 
    } 
    public boolean validateClass(Class<?> clazz){ 
     for (Class<?> c : validPossibleClasses){ 
      if (!c.isAssignableFrom(clazz)) 
       return false; 
     } 
     return true; 
    } 
    public void set(Object o) throws Exception{ 
     if (!validateClass(o.getClass())) 
      throw new Exception("Bad Cast"); 
     this.o = o; 
    } 
    public String getString(){ 
     return (String) o; 
    } 
    public Integer getInt(){ 
     return (Integer) o; 
    } 
    ... 
    // more specific getters 
} 

사용법이

String a = t.Cols(2).Row(3).getString(); 
t.Col(2).Row(3).set("b"); 
+0

더 자세히 설명 할 수 있습니까? –

+0

잠깐, 다른 방법으로 열을 저장하고 싶습니까? 또는 하나의 열에 여러 유형을 사용하는 데 문제가 있습니까? – greedybuddha

+0

둘 다. 처음에는 유형 안전을 잃지 않고 하나의 열에 여러 유형을 사용하고 싶습니다. 그게 가능하지 않다면 다른 접근법이 좋을 것입니다. –

0

같은 것? 필드

클래스 선수 : 같은 뭔가

String name; 
int points; 
int number; 

클래스 경기장 필드 :

String location; 
Date dateBuilt; 

클래스 팀 필드 :

String name; 
ArrayList<Players> roster; 

그런 다음 당신은 그냥 잡을 수있는 모든 값을 목록이나 arraylist에 넣고 데이터베이스 테이블로 구분하고 어떤 점을 추측 할 필요가 없습니다. 당신은 더 많은 물건을 잡아야 만 하겠지만, 당신이 무엇을 다루고 있는지 더 많이 알 수있을 것입니다.

+0

문제는 내 테이블이 얼마나 많은 열을 가지고 있는지 알지 못하며 어느 유형이 아닌지 알 수 없다는 것입니다. –