2009-12-16 6 views
1
나는 내부 클래스에 자바 자습서를 읽고 있었다

왜 이런 반복기를 작성해야합니까?

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

그것은 설명이 예제에서 "표준 자바 반복자와 유사하며 InnerEvenIterator 내부 클래스." 그래서 반복기는 자바에서 꽤 흔한 일입니다.

나는 C 프로그래밍 배경에서 왔습니다. 나는 왜 이런 단순한 루프가 두 가지 방법으로 반복자 (내부 클래스)로 확장되었는지 이해할 수 없다. 여기에 무슨 요점이 있니?

public class DataStructure { 
    //create an array 
    private final static int SIZE = 15; 
    private int[] arrayOfInts = new int[SIZE]; 

    public DataStructure() { 
     //fill the array with ascending integer values 
     for (int i = 0; i < SIZE; i++) { 
      arrayOfInts[i] = i; 
     } 
    } 

    public void printEven() { 
     //print out values of even indices of the array 
     InnerEvenIterator iterator = this.new InnerEvenIterator(); 
     while (iterator.hasNext()) { 
      System.out.println(iterator.getNext() + " "); 
     } 
    } 

//inner class implements the Iterator pattern 
    private class InnerEvenIterator { 
     //start stepping through the array from the beginning 
     private int next = 0; 

     public boolean hasNext() { 
      //check if a current element is the last in the array 
      return (next <= SIZE - 1); 
     } 

     public int getNext() { 
      //record a value of an even index of the array 
      int retValue = arrayOfInts[next]; 
      //get the next even element 
      next += 2; 
      return retValue; 
     } 
    } 

    public static void main(String s[]) { 
     //fill the array with integer values and print out only values of even indices 
     DataStructure ds = new DataStructure(); 
     ds.printEven(); 
    } 
} 
+0

인덱스를 통해 무언가를 찾는 것이 비용이 많이 들지만 요소에서 다음 단계로 이동하는 것은 저렴합니다 (예 : 긴 링크 된 목록). 루프의 성능과 반복기의 성능을 비교합니다. –

+1

또는 예를 들어 next() 메서드에서 필요에 따라 콘텐츠 데이터를 가져 오는 경우와 같이 목록의 크기를 실제로 알지 못하는 경우입니다. 이 경우 Iterator 추상화는 크기를 확인하기 위해 처음부터 전체 데이터 세트를 가져올 필요가 없음을 의미합니다. – Ash

답변

3

이것은 반복기를 가장 적절하게 사용하는 예가 아닌 내부 클래스를 보여줍니다.

"hello world"프로그램이 아무 것도하지 않는다고 불평 할 다음 물건!

+0

그 진술의 깎아 지른 유머를 위해 Ok +1! – GrayWizardx

+0

글쎄 ... 나는 OP가 "불평하고있다"고 확신 할 수 없다. – cletus

+0

글쎄, 뭔가 도움이됩니다. 그것은 "안녕하세요 세상"이라고합니다. –

3

반복자는 추상화입니다. 추상화가 일반적으로 좋습니다.

이터레이터를 사용하면 데이터 구조를 정수로 인덱싱 할 수없는 경우에도 반복기를 사용하면 좋은 방식으로 다양한 데이터 구조를 일관되게 검사 할 수 있습니다. 예를 들어, C++에서는 반복자를 사용하여 배열과 세트, 벡터, 맵, 심지어는 자신의 데이터 구조까지 모두 개념적으로 통일 된 방식으로 실행할 수 있습니다. 맵이 Strings에서 Widgets에 이르는 경우에도!

C++ 방식을 사용하면 반복기를 사용하면 다른 액세스 메커니즘을 사용할 때보 다 항상 효율적입니다. 자바는 우선 순위가 다릅니다. Stephen은 Java 자습서의 코드 예제가 반복자를 사용하거나 사용하려는 이유의 좋은 예가 아닐 수 있습니다.

1

스티븐 C와 동의합니다. 이것은 내부 클래스의 실례입니다. 나는 C에서 자바로 와서 여러분이 아마도 더 많은 객체 지향적 인 것들을 알게 될 것이라고 지적하고 싶습니다. OO 패러다임에 대한 친숙성에 따라 일부는 익숙한 기능적 프로그래밍 스타일에 비해 꽤 외국어로 보일 수 있습니다.

내부 클래스는 반복기를 나타내는 객체로 반복자와 같은 물건을 돌리는 또 다른 예일뿐입니다. 이렇게함으로써 우리는 객체 지향 프로그래밍에 너무나 중대한 추상 레이어를 얻게됩니다.

현재 : Java에 오신 것을 환영합니다!

건배, 배열을 통해

마이크 간단한 루프를 들어

+0

나는 수업이 너무 많아서 "Javans"가 수업을 더 많이 만들려고 수업을 만들었다 고 생각했습니다. – May

+0

언제든지 함수 포인터를 사용하여 자바 클래스를 생성 할 수 있습니다. – TofuBeer

6

, 당신은 (보통) 자바에서 Iterator를 사용하지 않을 것입니다.

for(int i=0;i < arrayOfInts.length ; i+2){ 
    System.out.println(arrayOfInts[i])); 
} 

반복자의 개념은 데이터가 소비자 (그것을 반복하기를 원하는 코드)에서 (배열을하지 않을 수 있습니다) 저장되는 방법을 분리하는 것입니다.

Iterator는 Java 클래스 라이브러리의 핵심 개념이므로, Java5에서 지원하는 for-each 루프 언어 기능이 일반적이라고 말할 수 있습니다. 이 루프를 사용하면 사용자는 Iterator를 더 이상 보지 못합니다.내가 "짝수 스테핑 반복자"을 구현한다면이 반복 가능한 모든 종류의와 함께 사용할 수 있도록

for(Something element: listOfSomething){ 
    System.out.println(element); 
} 

나는 정상 반복자에 기초한다.

public class EvenSteppingIterator<X> implements Iterator<X>{ 

     private final Iterator<X> source; 

     public EvenSteppingIterator(Iterator<X> source){ 
      this.source = source; 
      // skip the first one, start from the second 
      if (source.hasNext()) source.next(); 
     } 

     public boolean hasNext() { 
      return source.hasNext(); 
     } 

     public X next(){ 
      X n = source.next(); 
      // skip the next one 
      if (source.hasNext()) source.next(); 
      return n; 
     } 


} 
0

연결된 예제에서 설명한 상황에서 내부 클래스를 사용하지 않을 것이라고 생각합니다. 예를 들어, for 루프를 사용하는 C 스타일 코드가 더 좋습니다. 하지만이 튜토리얼의 의도는 내부 클래스의 사용에 대해 학습자를 교육하는 것이므로이 예제는 내부 클래스 의 개념을 이해하는 데 도움이됩니다. 실용적인 용도는 적합하지 않지만 말입니다.

자습서에 언급 된대로 Inner 클래스는 GUI 프로그래밍의 이벤트 처리 부분에서 유용합니다. 이벤트 처리를 위해 내부 클래스의 인스턴스를 으로 등록 할 수 있습니다 (GUI의 버튼에 대한 작업의 경우)버튼에 대해 작업이 수행 될 때 호출되는 EventHandler를 등록 할 수 있습니다. (말해 버튼 클릭) (콜백 메커니즘). 내부 클래스는 둘러싼 클래스의 private 멤버에 액세스 할 수 있습니다. 이벤트 처리 코드가 더 작은 경우 (대부분의 경우 에서처럼) 내부 클래스 을 GUI 코드와 함께 사용하는 것이 좋습니다.

자습서에 GUI 코드가있는 내부 클래스 사용 예가 나와있는 경우, 혼란스럽고 목적을 달성하지 못했을 것입니다. 초보자 용 자습서로 생각하고 그것을 통과하는 사람이 Java를 사용하여 GUI 개발에 익숙하지 않았을 수도 있습니다.

관련 문제