클래스가 동일한 기본 동작, 메소드 등을 구현하지만 해당 클래스의 여러 버전이 다른 용도로 존재할 수있는 상황을 고려하십시오. 내 특별한 경우에는 벡터 (목록이 아닌 기하학적 벡터)가 있고 그 벡터는 모든 N 차원 유클리드 공간 (1 차원, 2 차원, ...)에 적용될 수 있습니다. 이 클래스 / 타입을 어떻게 정의 할 수 있습니까?
클래스 템플릿이 실제 값을 매개 변수로 가질 수있는 C ++에서는 쉽지만 Java에는 그러한 고급 스러움이 없습니다.
이 문제를 해결하기 위해 취할 수있는 두 가지 접근 방식은 다음과 같습니다.
컴파일 타임에 가능한 각 사례를 구현합니다.
public interface Vector { public double magnitude(); } public class Vector1 implements Vector { public final double x; public Vector1(double x) { this.x = x; } @Override public double magnitude() { return x; } public double getX() { return x; } } public class Vector2 implements Vector { public final double x, y; public Vector2(double x, double y) { this.x = x; this.y = y; } @Override public double magnitude() { return Math.sqrt(x * x + y * y); } public double getX() { return x; } public double getY() { return y; } }
이 솔루션은 시간이 많이 걸리고 코드 작성에 지루합니다. 이 예제에서는 그리 나쁘지는 않지만 실제 코드에서는 최대 4 개의 차원 (x, y, z 및 w)으로 각각 여러 구현이있는 벡터를 처리하고 있습니다. 각 벡터에는 실제로 500 개만 필요하지만 현재 2,000 줄 이상의 코드가 있습니다.
런타임시 매개 변수 지정
public class Vector { private final double[] components; public Vector(double[] components) { this.components = components; } public int dimensions() { return components.length; } public double magnitude() { double sum = 0; for (double component : components) { sum += component * component; } return Math.sqrt(sum); } public double getComponent(int index) { return components[index]; } }
불행히도이 솔루션은 코드 성능을 저하시키고 이전 솔루션보다 더 복잡한 코드를 생성하며 컴파일 타임에 안전하지 않습니다 (컴파일 타임에 처리하는 벡터가 실제로 2 차원임을 보장 할 수는 없습니다. 예를 들어).
저는 현재 Xtend에서 실제로 개발 중이므로 Xtend 솔루션을 사용할 수 있다면 수용 할 수 있습니다.