L'interfaccia 'Iterable' sembra ridondante in java? [chiuso]

-2

In base alla seguente definizione (pre 1.8) di Iterable ,

package java.lang;

import java.util.Iterator;


public interface Iterable<T> {
    Iterator<T> iterator();
}

Direi che, Iterable dipende dall'interfaccia Iterator come mostrato di seguito,

package java.util;

public interface Iterator<E> {

    boolean hasNext();


    E next();


    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

}

La raccomandazione standard è che qualsiasi implementazione che implementa l'interfaccia Iterable diventa iterabile.

Ma sintatticamente, MyClass può implementare l'interfaccia Iterator e abilitare l'implementazione MyClass come iterabile senza menzionare esplicitamente class MyClass **implements Iterable**{} , aggiungendo Iterator<T> iterator(); comportamento in Iterator interfaccia anziché Iterable interfaccia. Ciò sarebbe stato semplificato presentando solo un'interfaccia ( Iterator ). Iterator può contenere tutte le responsabilità che Iterable fa.

Quindi, qual è la ragione dietro l'aggiunta del comportamento di Iterator<T> iterator(); nell'interfaccia Iterable (ridondante) invece dell'interfaccia Iterator ?

Non sono chiaro con lo scopo di introdurre l'interfaccia Iterable .

Per favore aiutami a capire.

Per me, questa non è una domanda duplicata perché questo è un risposta che parla della violazione di SRP.

    
posta overexchange 23.07.2015 - 08:39
fonte

1 risposta

2

Iterator è stato, Iterable è stateless.

Iterator non sa dove si trova al momento, ma Iterable non dovrebbe, perché può essere iterato da due (o più) "attori" indipendenti.

In sostanza Iterable è in grado di fornire a chiunque un nuovo Iterator su richiesta.

Sembra che questa domanda continui a venire, anche se per lo più su StackOverflow non qui:

link

link

    
risposta data 23.07.2015 - 08:42
fonte

Leggi altre domande sui tag