int에 하나, String에 하나, 다른 유형의 사용자 정의 오브젝트에 대해 하나씩 3 개의 링크 된 목록을 만들어야한다고 가정 해보십시오. 제네릭을 사용했다면 하나의 링크 된 목록을 작성하는 것만으로도 쉽게 할 수 있지만 제네릭을 사용하지 않는 경우 동일한 반복 코드를 3 번 쓰는 것을 피할 수있는 방법이 있습니까?제네릭없이 코드 재사용
답변
int
대신 Integer
을 사용하는 경우 그렇습니다. 이 경우 세 객체는 모두 Object
의 하위 클래스이므로 Linked List 클래스는 Object
을 처리 할 수 있습니다.
코드는 대략처럼 보일 것이다
class MyLinkedList{
public void add(Object){...}
public Object remove(Object){...}
...
}
ints vs Strings에 대해 동일한 코드를 사용할 수는 없지만 Integers를 의미한다고 가정하면 java.lang.Objects를 저장하는 LinkedList를 만들어야합니다. 그런데 일반적인 LinkedLists의 기본 기능은 다음과 같습니다. .
연결된 목록이 처리하는 형식을 자신의 형식 (예 : StringOrIntOrCustom
)으로 추상화하고 각 형식 중 하나를 사용할 수 있으며 유효한 플래그를 지정할 수있는 플래그를 사용할 수 있습니다. 그러나이 데이터 형식을 사용할 때마다 형식이 지원하지 않는 작업을 수행하지 않도록 많은 검사를 수행해야합니다.
Java 1.5에서 제네릭을 소개하기 전에 컬렉션은 모두 Object 유형을 사용 했으므로 객체의 연결 목록을 사용하게됩니다. 그런 다음 올바른 유형을 추가, 검색 및 캐스팅했는지 확인해야합니다.
Java 1.4를 사용하는 것이 더 이상 필요하지 않거나 더 이상 권장되지 않기 때문에 제네릭을 사용하지 않아야하는 이유가 표시되지 않습니다.
당신은 밖으로 제네릭 함께 할 수 있지만, 당신은 더 컴파일 시간 유형 안전 검사를하지 않을 것이다 당신이 수동으로 모든 유형의 캐스팅을 추가해야합니다.
그러나 제네릭을 사용할 때 컴파일러가 수행하는 작업을 다시 수행하게됩니다. 이제는 오류가 발생하기 쉽고 수동 일뿐입니다.
예, 그렇게 할 수 있으며 그리 어렵지 않습니다.
abstract class ListNode {
public ListNode next_;
};
interface ListNodeFactory {
public ListNode createListNode();
}
그런 다음 조작하는 개체를 ListNode List
클래스를 만들 수 있습니다. 필요한 경우 새로운 ListNode를 작성하기 위해 호출하는 함수가 있습니다. add
메서드는 ListNodeFactory
인수를 취합니다. 대부분의 메소드가 protected
일 것이라고 제안합니다. 파생 클래스가 아닌 클라이언트가 그것을 사용하지 않기 때문입니다.
각 유형에 대해 List
에서 파생 클래스를 만듭니다. 원하는 메서드를 사용하는 메서드로 각 메서드를 래핑해야합니다. 적절한 유형의 새 목록 노드를 만드는 ListNodeFactory
구현을 만들어야합니다. 또한 데이터를 얻기 위해 트래버스 또는 제거에서 적절한 유형으로 나가는 객체를 캐스팅해야합니다 (ListNode
). 다음은 예입니다.
class IntListNode extends ListNode {
public int data_;
public IntListNode(int x) {
data_ = x;
}
}
class IntListNodeFactory implements ListNodeFactory {
IntListNodeFactory() {
nextdataset_ = false;
}
IntListNodeFactory(int x) {
nextdataset_ = true;
data_ = x;
}
void setNextData(int x) {
nextdataset_ = true;
nextdata_ = x;
}
public ListNode createListNode() {
if (!nextdataset_) {
throw Exception("Tried to create a node with no data!");
} else {
ListNode result = new IntListNode(data_);
nextdataset_ = false;
return result;
}
}
}
- 1. 재사용 코드 자바
- 2. 예외 처리에서 코드 재사용
- 3. 레이아웃 XML과 코드 재사용
- 4. jQuery 코드 재사용?
- 5. 유닛 테스트에서 코드 재사용
- 6. MVP 패턴의 코드 재사용
- 7. xml "재사용 가능"코드
- 8. 코드 재사용, 스레딩 클래스
- 9. 측정 코드 재사용 가능성
- 10. 재사용 가능한 아키텍처 코드 관리
- 11. 자바 스크립트 소스 코드 재사용
- 12. XAML- 상속, 코드 재사용, 최적화
- 13. django 재사용 가능한 템플릿 코드
- 14. 다른 레일 응용 프로그램에서 코드 재사용
- 15. Django, javascript 및 코드 재사용 문제
- 16. iPhone 용 재사용 가능한 웹 서비스 코드
- 17. Grails 프로젝트 간 코드 재사용 - 유지 DRY
- 18. django와 appengine 간의 코드 재사용 모델 클래스
- 19. 코드 재사용 라이브러리는 어떻게 만들고 유지 관리합니까?
- 20. 여러 Rails 응용 프로그램에서 Ruby 코드 재사용
- 21. 의 ASP .NET 코드 재사용/복사 질문
- 22. 개인용 재사용 가능한 코드 저장소 시작하기
- 23. 코드 기반 UIView를 XIB와 비교하여 재사용
- 24. Excel에서 VBA 코드 패키징 및 재사용
- 25. Android NDK 가져 오기 모듈/코드 재사용
- 26. Javascript를 통한 코드 재사용 프로토 타입 상속
- 27. 제네릭없이 기본 클래스에서 파생 클래스의 형식을 얻는 방법?
- 28. 템플릿을 사용한 코드 재사용 문제 3D 수학 용 벡터 클래스
- 29. 코드 재사용 (템플릿 또는 상속)에 대한 질문
- 30. 재사용 가능한 메일 클라이언트 라이브러리를위한 코드 구성 및 디자인
아, 맞습니다. 나는 제네릭을 사용할 수 없습니다. 왜냐하면 그것이 제가 작업중인 과제의 제한 사항 중 하나이기 때문입니다. – elemental009
Java의 모든 클래스가 객체 baseclass를 확장한다는 점을 제외하고는 매우 최신 할당과 같지 않습니다. – Daff