2010-03-07 6 views
3

API를 설계하고 있습니다. 그것은 똑같이하는 많은 메소드를 가지지 만, 다른 매개 변수 프리미티브를가집니다. API 디자인에서 프리미티브 피하기?

public void someMethod1(int x); 
public void someMethod1(float x); 
public void someMethod1(double x); 
public void someMethod2(int x, int y); 
... 
public void someMethod3(int x, int y, int z); 
... 

인해 프리미티브에, 나는 시간이 지남에 따라 상당히 이상 유지할 생각을 많이 붙여 &을 복사해야합니다. 메소드와 생성자에서 프리미티브를 피하는 것이 좋은 생각일까요? 예를 들어, 위의 교체는 다음과 같습니다

public <T extends Number> void someMethod1(T x); 
public <T extends Number> void someMethod2(T x, T y); 
public <T extends Number> void someMethod3(T x, T y, T z); 

편집 : 이것의 단점은 무엇

?

+1

너무 많은 질문이 있습니다. 여러 가지 질문을하고 싶을 수도 있습니다. API 디자인의 기본 요소에 대해서만 묻는 것이 아닙니다. – Brabster

+0

자바에서는 이것을 쉽게 해결할 수있는 방법이 없습니다. 코드 생성기를 복제하거나 사용하는 것입니다 (예 : Trove가 기본 TIhLongHashMap을 가지고 있으며 기본 Java HashMap보다 훨씬 빠름) 또는 객체를 사용하거나, 거대한 성능 패널티로 살아갑니다. 자동 (un) boxing 수백만 개의 프리미티브와 수백만 개의 불필요한 객체 생성은 perfs를 죽이는 확실한 방법입니다. 기본 Java API와 클린 OO를 기반으로 한 것들이 커다란 콜렉션을 위해 단순히 그것을 잘라 내지 않는 이유입니다. 그 때 당신은 Trove와 같은 것을 사용합니다. 그것은 당신의 요구 사항에 달려 있습니다. – SyntaxT3rr0r

답변

4

Java 1.5 이상에서는 자동 보봇 (autoboxing)/자동 상자 표시 (autounboxing) 때문에 사용할 수 있습니다. 을 Integer이 될 것으로 예상하거나 그 반대로 전달하면 캐스트가 자동으로 실행됩니다. 반환 값에도 동일하게 적용됩니다.

귀하의 방법 본문에 어떤 형태로든 Number이라는 것보다 귀하의 주장에 대해 더 많이 알 수 있습니다. 정수와 부동 소수점 표현을 구별하지 않는 경우에만 적합합니다.

성능을 향상시키지 않습니다. 캐스트에 약간의 페널티가 있지만 병목 현상이 발생할 때까지 걱정하지 않아야합니다. 대부분의 응용 프로그램에서는 그 차이가 미미합니다.

어레이가 아닌 List을 사용할지 여부는 실제로 디자인에 의해 결정되어야하지만 일반적으로 어레이가 필 요하지 않으면 일반적으로 List을 사용하는 것이 좋습니다. List은 더 유연하고, 크기를 조정할 필요가없고, Collections API 등의 모든 이점을 가지고 있습니다.

1

API는 의미론과 관련이 있습니다. 따라서 질문에 대한 대답은 진술해야합니다. API 디자인에서 기본 요소 사용 안함)은 API의 기능에 따라 달라집니다.

int addOne(int integer)은 의미 상으로 일관되며 문제 도메인을 반영하기 때문에 유지 관리에 많은 문제가 나타나지 않습니다.

Employee getEmployee(int empID)은 부적절한 것으로 분류 될 수 있으며 직원 ID가 말하면 String으로 변경되면 유지 관리 문제가 발생할 수 있습니다.

2

List<T>T[]에 대한 질문에 답변하려면 두 가지 모두 구현에 대한 세부 정보가 필요합니다.

List<T>은 클라이언트 코드를 변경하지 않고 목록 구현을 변경할 수 있으므로 T[]보다 유지 관리가 쉽습니다.

클라이언트 코드로 목록을 수정해서는 안되는 경우 구현 세부 정보를 노출하지 않고 반복 이외의 작업을 수행하지 않으므로 Iterable<T>을 사용하는 것이 좋습니다.

+0

Iterable은 좋은 것입니다! 고맙습니다! – Pindatjuh

+0

P. 나는이 질문을 편집했다 : 이것은 질문에 대한 답이다.'List '은'T []'를 대신 할 수있다. – Pindatjuh

1

이 패턴은 모델 - 뷰 컨트롤러 시스템에서 속성을 정의하는 데 종종 사용되는 유효한 패턴입니다. 또한 -128에서 127 범위의 int를 사용하면 Integer.valueOf(int)을 사용하여 변환하면 Integer에 관한 사항을 조금 빠르게 할 수있어 Java에 의해 자동 캐시됩니다. java.lang.Integer.IntegerCache.high 속성 (항상 127 이상)을 사용하여 캐시 된 범위를 늘릴 수도 있습니다.자동 권투가이 정수 캐시를 사용하는 경우도있을 수 있지만 확실치 않습니다. 클래스가 고성능 환경에서 사용하도록 설계된 경우 다른 대안을 대신 사용하고 프리미티브를 사용합니다.