15 내부 클래스 와 Array List 의 실현

내부 클래스 에 대하 여:
내부 에 쓰 면 개인 적 인 것 이 고 내부 클래스 는 Public 의 디자인 에 문제 가 있 습 니 다. Public 가 되 었 으 니 내부 에 넣 어야 합 니 다. 내부 클래스 는 반드시 Public 이 어야 합 니 다. 초기 화 는 외부 클래스 의 인용 에 의존 해 야 합 니 다. 그렇지 않 으 면 클래스 정의 에 포 함 된 Outer. this 는 예화 할 수 없습니다.
Outer 방문 Inner: 반드시 inner 의 대상 을 만들어 야 합 니 다 (그렇지 않 으 면 실례 화 할 때 분명히 문제 가 있 습 니 다). 아니면 모두 static 입 니 다.Inner 는 Outer 에서 예화 한 후에 Inner 의 개인 속성 을 직접 사용 할 수 있 습 니 다. 이것 은 강제 규정 입 니 다. 물론 automic unt 의 규정 을 약간 파 괴 했 습 니 다. 내장 류 도 마찬가지 입 니 다.
Inner 방문 Outer: 기본적으로 Outer. this 참조 가 있 습 니 다. 물론 Outer 의 속성 과 방법 은 Inner 에서 직접 방문 할 수 있 습 니 다. Outer. this 구분 을 추가 하지 않 아 도 됩 니 다. (이름 이 이의 성 이 없 을 때 덮어 씁 니 다)
Array List 에 대한 디자인:
교체 기 reove () 가 더 좋 습 니 다. 물론 이 방법 은 다른 방법의 실현 에 지나치게 의존 하고 결합 이 큽 니 다. 예 를 들 어 내부 필드 expected ModCount 는 Array List 의 modCount 가 수정 되 는 것 을 알 아야 합 니 다.
Concurrent ModificationException 은 필드 modCount 를 통 해 이 루어 집 니 다. 물론 동기 화 되 지 않 았 기 때문에 동시 다발 할 때 오류 가 있 을 수 있 습 니 다. 힌트 를 주지 않 고 생각 일 뿐 입 니 다.
코드:
package nuaa.ds;

import java.util.AbstractCollection;
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;

public class ArrayList extends AbstractCollection implements List {

	private static final int DEFAULT_CAPACITY = 2;
	private static final int NOT_FOUND = -1;
	
	private T[] theItems;
	private int theSize;
	private int modCount = 0;//          ,                
	
	public ArrayList(){
		clear();
	}
	
	public ArrayList(Collection extends T> c){
		clear();
		for(T obj:c)
			add(obj);
	}
	
	
	@Override
	public void clear() {
		theSize = 0;
		theItems = (T[])new Object[this.DEFAULT_CAPACITY];
		modCount++;
	}

	@Override
	public boolean addAll(int index, Collection extends T> c) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public T get(int index) {
		if(index<0||index>=size())
			throw new ArrayIndexOutOfBoundsException();
		return theItems[index];
	}

	@Override
	public T set(int index, T element) {
		if(index<0||index>size())
			throw new ArrayIndexOutOfBoundsException();
		T old = theItems[index];
		theItems[index] = element;
		return old;
	}
	
	
	@Override
	public boolean contains(Object o) {
		return findPos(o)!=NOT_FOUND;
	}
	
	private int findPos(Object o){
		for(int i=0;i listIterator() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public ListIterator listIterator(int index) {
		return new ArrayListIterator(index);
	}

	@Override
	public List subList(int fromIndex, int toIndex) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Iterator iterator() {
		return new ArrayListIterator(0);
	}

	@Override
	public int size() {
		return theSize;
	}
	private class ArrayListIterator implements ListIterator{

		private int current;
		private int expectedModCount = modCount;
		private boolean nextCompleted = false;
		private boolean prevCompleted = false;
		
		ArrayListIterator(int pos){
			if(pos<0||pos>size())
				throw new IndexOutOfBoundsException();
			current = pos;
		}
		@Override
		public boolean hasNext() {
			if(expectedModCount!=modCount)
				throw new ConcurrentModificationException();
			return current0;
		}

		@Override
		public T previous() {
			if(!hasPrevious()){
				throw new NoSuchElementException();
			}
			prevCompleted = true;
			nextCompleted = false;
			return theItems[--current];
		}

		@Override
		public int nextIndex() {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public int previousIndex() {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		/**
		 *     remove      current,
		 *                remove(obj)          
		 */
		public void remove() {
			if(expectedModCount!=modCount)
				throw new ConcurrentModificationException();
			if(nextCompleted)
				ArrayList.this.remove(--current);//  next   current       
			else if(prevCompleted)
				ArrayList.this.remove(current);
			else
				throw new IllegalStateException();
			prevCompleted = nextCompleted = false;
			expectedModCount++;//     remove    modCount   
		}

		@Override
		public void set(T e) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void add(T e) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	//cheap main
	public static void main(String[] args){
		ArrayList al = new ArrayList();
		for(int i=0;i<20;i++){
			al.add(i);
		}
		System.out.print(al.toString());
	}

}

좋은 웹페이지 즐겨찾기