2014-12-31 1 views
1

작은 개인용 유틸리티 라이브러리 용 Grid 클래스의 구현 작업 중입니다. 많은 작업을 한 후에 Grid 클래스를 정리하고 일부 기능을 추가했습니다. 내 Grid 클래스에서 사용하고자하는 핵심 기능 중 하나는 지정된 유형의 단일 2D 배열을 생성자의 인수로 사용할 수 있다는 것입니다.원시 배열에 관한 Java Generics 메서드 코드 중복 문제

생성자에 대한 프리미티브 배열을 전달하려고 시도하는 코드를 컴파일 할 수 없다는 것을 알기 전까지는 정상적으로 작동했습니다. autoboxing은 프리미티브 배열에서는 일어나지 않기 때문에 코드 재사용의 형태로 나에게 설계상의 문제가 생긴다. 그리드를 초기화하는 메소드는 전달 된 배열의 유형에 관계없이 프리 머 티브 일지라도 동일하지만 모든 다른 유형의 프리미티브에 대해 별도의 생성자를 작성해야합니다. 어느 날 9 개의 다른 생성자가 있다고 가정합니다. 기본 생성자 만 사용한다고 가정합니다. 그리드 래핑 옵션과 같은 다른 인수를 사용하여 생성자를 가질 계획이었습니다.

이 코드 중복을 피할 방법이 없다고 가정하면 맞습니까?

+2

예, 당신 말이 맞아. 죄송합니다. –

+0

원시 배열에서 autoboxing이 발생하지 않는다는 것을 혼동합니다. 모든 배열은 객체이며 일반 유형에 사용할 수 있습니다. 코드를 보여주는 마음? 당신을 정확하게 이해하고 있는지 잘 모르겠다. –

+0

[builder pattern] (http://stackoverflow.com/questions/328496/when-would-you-use-the-builder-pattern/1953567# 1953567)를 사용하여 텔레 스코핑 생성자에서 벗어나십시오. –

답변

4

Array 클래스를 사용하면 대부분의 복제를 피할 수 있습니다. 하지만 꽤 좋지 않습니다. 생성자 매개 변수의 유형은 Object이고, 호출자가 Socket 또는 Properties이 아닌 실제 배열을 전달해야한다는 것을 신뢰해야합니다.

예를 들어, 다음과 같이 자신의 권투를 할 수있는 :

<T> public T[][] boxArray(Class<T> clazz, Object array) { 
    int height = Array.getLength(array); 
    int width = height == 0 ? 0 : Array.getLength(Array.get(array, 0)); 
    T[][] result = (T[][]) Array.newInstance(clazz, height, width); 
    for(int i = 0; i < height; i ++) { 
     Object a = Array.get(array, i); 
     for(int j = 0; j < width; j++) { 
      result[i][j] = (T) Array.get(a, j); 
     } 
    } 
    return result; 
} 
+1

나는'Array.get'이 존재하는지 전혀 몰랐습니다. 나는 실제로 이것을하는 OP를 추천하지 않을 것이다. (그의 클래스는 명확하게 일반화되어야한다.) 그러나 이것의 독창성에 +1. –

+0

지금은 작동 할 수 있습니다. 고맙습니다! 하지만 일단 대중에게 공개되면 (일단 라이브러리를 오픈 소스로 만들면) 여러 생성자로 다시 전환해야 할 것입니다. 오픈 프로젝트의 경우, 유형 안전성에 관해서는 두 가지 중 적은 것 중 적은 것을 코드 중복으로 사용할 것입니다. 하지만 개인 프로젝트의 경우에는 이것이 가능합니다. – Aargonian

+0

여러 개의 공용 한 행 생성자가 원시 배열을 사용하고 결국 모두 동일한 개인 배열을 호출하여 'Array'에서 작동하는 공통 논리를 포함함으로써 * kinda * 유형으로 안전하게 만들 수 있습니다. 어쨌든 그렇게 할 수있는 방법입니다. (기록을 위해, 필자는 강력하게 동의하지 않는다. 코드 복제는 안전을 타자하는 "덜 나쁜"것이다. – Dima