Conforme o diagrama abaixo, exceto pela interface Iterable
, todas as construções restantes (interface / classe / classe abstrata) ficam no mesmo pacotejava.util
Por que Iterable
sentar no java.lang
pacote?
Nota: A intenção é entender o aspecto de empacotamento da programação java.
java
api
packages
collections
overexchange
fonte
fonte
Respostas:
Conforme explicado em seu javadoc , o objetivo de
Iterable
é suportar sintaxe de idioma específica :Como tal, pertence ao pacote lang , que
Outras classes no diagrama pertencem ao JCF e, portanto, estão no pacote util que
fonte
Iterator
idealmente , isso também deveria estar dentrojava.lang
, já queIterable
é. Obviamente, isso deve ser feitojava.util
por 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).Iterable
sobreIterator
, ojava.lang
pacote geralmente não dependem de classes emjava.util
.)Porque muitas coisas implementam a interface Iterable ou a estendem como uma sub interface.
As classes de implementação são:
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:
fonte