Estrutura de empacotamento de coleções Java (java.util) - por que o Iterable fica em java.lang?

12

Conforme o diagrama abaixo, exceto pela interface Iterable, todas as construções restantes (interface / classe / classe abstrata) ficam no mesmo pacotejava.util

insira a descrição da imagem aqui

 

Por que Iterablesentar no java.langpacote?

Nota: A intenção é entender o aspecto de empacotamento da programação java.

overexchange
fonte
pergunto por que isso está marcado como java8 , todas as APIs solicitadas aqui são muito mais antigas. Iterable foi introduzido em Java versão 1.5, coleções quadro em 1.2
mosquito

Respostas:

22

Conforme explicado em seu javadoc , o objetivo de Iterableé suportar sintaxe de idioma específica :

A implementação dessa interface permite que um objeto seja o destino da instrução "foreach"

Como tal, pertence ao pacote lang , que

Fornece classes que são fundamentais para o design da linguagem de programação Java.


Outras classes no diagrama pertencem ao JCF e, portanto, estão no pacote util que

Contém a estrutura de coleções ...

mosquito
fonte
+1. Eu acho que, Iteratoridealmente , isso também deveria estar dentro java.lang, já que Iterableé. Obviamente, isso deve ser feito java.utilpor razões de compatibilidade com versões anteriores (ele foi introduzido no JDK muito antes da construção "foreach" dar a ele um papel no idioma apropriado).
Ruakh
O @ruakh Iterator é conveniente, mas provavelmente foi considerado muito específico (seleção e nomeação de métodos) para ir ao pacote "fundamental". Pense em seu antecessor enumeração , que eventualmente acabou não tão conveniente como se pensava inicialmente, era prudente que não ir para pacote lang
mosquito
Meu argumento não era que fosse conveniente, mas que a linguagem adequada agora depende disso. (Note-se que, além da dependência de Iterablesobre Iterator , o java.langpacote geralmente não dependem de classes em java.util.)
ruach
@ruakh eu vejo. Esse é um ponto muito bom, obrigado. Posso entender por que os designers de API queria Iterable para expor "um objeto que executa iteração", mas o caminho que eles escolheram para fazer isso não se sente elegante
mosquito
6

Porque muitas coisas implementam a interface Iterable ou a estendem como uma sub interface.

As classes de implementação são:

  • java.util
    • AbstractCollection
    • AbstractList
    • AbstractQueue
    • AbstractSequentialList
    • AbstractSet
    • ...
    • concorrente
      • ArrayBlockingQueue
      • ConcurrentLinkedDeque
      • ...
  • java.beancontext
    • BeanContextServicesSupport
    • BeanContextSupport
    • ...
  • java.sql
    • BatchUpdateException
    • DataTruncation
    • ...
  • javax.management
    • AttributeList
  • javax.print.attribute.standard
    • JobStateReasons
    • ...
  • ...

Esta é uma lista enorme. E toca em todos os tipos de pacotes por aí.

Além disso, você deseja minimizar as dependências circulares do pacote . Se uma classe no pacote A depende de uma classe no pacote B, que depende de uma classe no pacote A, você tem uma dependência circular. Nem sempre são ruins porque existem - mas levam a outras dependências circulares e isso pode ser uma coisa ruim. Não é ruim por si só, mas é um cheiro de design que indica que o acoplamento entre duas classes ou pacotes é muito apertado. É o começo da acumulação de dívidas técnicas.

A solução para isso é dizer "sim, a interface Iterable é algo em que é dependente uma grande variedade de classes e pacotes em toda a estrutura java e javax. Ela deve estar na base das bibliotecas de idiomas - java .lang ".

E é aí que você o encontrará.

Leitura relacionada:

Comunidade
fonte