2010-07-14 5 views
8

이것은 나쁜 습관입니까?제네릭 스태킹

ArrayList<ArrayList<ArrayList<Double>>> list = new ArrayList<ArrayList<ArrayList<Double>>>(); 
+0

내 머리가 아플지라도, 내가 아는 한 허용되는 것으로 간주됩니다. –

+2

예를 들어 나쁜 습관을 어떻게 정의합니까? –

+0

눈에 띄지 않는 것은 나쁜 습관입니다. –

답변

4

이것은 반드시 나쁜 습관은 아닙니다. 그것은 단지 "읽을 수없는"것입니다. 곧 자바 7 당신은 파라미터 화 된 형태를 구성 할 때 특정 제네릭 형식의 cruft에를 생략 할 수있어, 인내의 비트 :

List<List<List<Double>>> list = new ArrayList<>(); 

이이 type inference이라고합니다. 당신은 컴파일러 경고와 함께 살 수있는 경우

지금부터, 당신은 단지 그렇게 할 수 있습니다 :

List<List<List<Double>>> list = new ArrayList(); 
+0

'public static 리스트 createArrayList()'와 같은 것을 찾는 팩토리 메소드를 생성 한 다음 생성자 대신에 그것을 호출 할 수 있다고 생각합니다. 형식 유추는 자동으로 할당 유형에 따라 이 무엇인지 결정합니다. – Mike

+0

또는 Guava의'Lists' 클래스를 사용하고 생성자 호출을'Lists.newArrayList()'로 바꿉니다. 이것은 마이크가 제안한 것과 정확히 일치합니다. – whiskeysierra

2

글쎄, 요소가 목록 인 요소를 가진 목록이 필요합니까? 우리에게 말하지 않으면 성취하려는 것이 무엇인지 알 수 없습니다.

그러나 대신 직접 ArrayList을 사용하는 것은 실제로 바람직하지 않습니다.

+0

당신이 옳습니다. 감사합니다. 내가 왜 List를하지 않았는지 모르겠다. – rhombidodecahedron

1

사용 방법에 따라 다릅니다. 아마도 2 차원 목록을 캡슐화하고 List<TwoDimensionalList<Double>>으로 끝낼 수 있습니다. 아마도 TwoDimensionalList.get(int i, int j)과 같은 연산을 사용하여 i 번째 목록의 j 위치에있는 요소를 가져올 수 있습니다.

편집 : 2 차원 목록의 목록이 아니라 3 차원 목록 인 경우 물론 ThreeDimensionalList이 필요합니다. (목록의 크기가 고정되어있는 경우 요소 (i,j,k)이 위치 i*dim1 + j*dim2 + k*dim3에있는 단일 배열 (목록)을 사용하여 내부적으로이를 구현할 수 있습니다.

7

이것은 ArrayList를 기반으로 한 3 차원 행렬입니다. 멋지게 보일 수는 없지만 그렇게해야합니다.

대안이 될 수 : 조금 짧고 인터페이스 방법에 단지 관심이 대부분의 경우에서와 같이 일반적으로 OK입니다

List<List<List<Double>>> list = new ArrayList<List<List<Double>>>(); 

합니다.

크기를 조정할 수있는 3 차원 행렬 데이터 구조가 필요한 경우이 방법이 좋습니다.

4

달성하려고하는 동작을 처리하기 위해 새 클래스를 만드는 것이 좋습니다. 전용 ArrayList<...> (상속보다 위임에 유리하다)을 사용하는 클래스를 만들고 필요한 메서드를 만듭니다. 무엇이라도 있으면 읽고 이해하기가 더 쉬워야합니다.

0

적어도 더 명쾌하게 이름을 지정하면 3dList와 같은 것이 도움이 될 것입니다. 다른 사람들이 위에서 제안한 것처럼 나에게 2D/3D 목록의 맞춤 캡슐화를 작성하는 것이 좋습니다.

+0

좋은 제안이지만 자바에서는 식별자가 숫자로 시작할 수 없습니다. 더 좋은 것을 발명;) – BalusC

+0

ThreeDimensionalList? ThreeDList? – whiskeysierra

3

예를. 대부분의 경우 코드가 더 유용합니다. double[][][]

+0

Double 객체의 ArrayLists에 대한 ArrayList의 ArrayList가 희소 배열이 아닌 경우 훨씬 더 많은 공간을 차지할 가능성이 높으므로이 방법은 더 나은 선택입니다. –

+0

일반적으로 올바른 것입니다. Java 프로그래머는 객체가 소개하는 메모리 오버 헤드를 정기적으로 과소 평가합니다. 그러나 매트릭스를 즉시 크기 조정할 수 있어야하고 미리 크기를 예측하기가 어려울 것이라는 것을 미리 알고 있다면 "stack o generics"방식을 사용해야 할 수도 있습니다. 특히 C와 달리 배열은 Java에서 동적으로 크기를 조정할 수 없으므로 특히 그렇습니다. – rtperson