Java에서는 API의 구체적인 클래스보다는 인터페이스 유형을 사용하는 것이 좋습니다.
당신의 문제는 ArrayList
당신이 실제로 사용해야 할 곳 (아마 많은 곳에서)을 사용하고 있다는 것 List
입니다. 결과적으로 목록이 ArrayList
.
코드는 다음과 같습니다.
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
문제에 대해 제안한 "해결 방법"은 다음과 같습니다.
new ArrayList(input.subList(0, input.size()/2))
하위 목록을 복사하여 작동합니다. 정상적인 의미에서 슬라이스가 아닙니다. 또한 하위 목록이 크면 복사본을 만드는 데 비용이 많이 듭니다.
당신은 당신이 있음 API에서 제한하는 경우 변경할 수 없습니다 당신이 있도록, 해야 선언 inputA
int로서 ArrayList
, 당신의 사용자 정의 서브 클래스 구현 할 수있을 ArrayList
하는 subList
방법의 서브 클래스를 반환합니다 ArrayList
. 하나:
- 설계, 구현 및 테스트하는 데 많은 작업이 필요할 것입니다.
- 이제 클래스의 문서화되지 않은 측면 (따라서 "변경 될 수 있음") 측면에 대한 종속성이있는 중요한 새 클래스를 코드베이스에 추가했습니다
ArrayList
.
ArrayList
대신에 하위 클래스의 인스턴스를 만들기 위해 인스턴스를 만드는 코드베이스의 관련 위치를 변경해야합니다 .
"배열 복사"솔루션이 더 실용적입니다. 이것이 진정한 슬라이스가 아니라는 점을 염두에 두십시오.
ArrayList
합니까? 난 당신이 인터페이스가 있기 때문에 어떻게 작동하는지 이해하는 조금 부족한 것 같아요List
및ArrayList
"호환되지 않는"아니다 -ArrayList
구현을List
하고,List
아마 당신이 필요로하는 모든 필요한 메서드가 포함되어 있습니다.