Do containsAll () e retainAll () no endereço da interface Coleção cardinalidade?

StackOverflow https://stackoverflow.com/questions/816379

  •  03-07-2019
  •  | 
  •  

Pergunta

Em Java, o containsAll e retainAll na classe AbstractCollection explicitamente estado que cardinalidade não é respeitada, mas em outras palavras, não importa quantas instâncias de um valor estão em cada lado. Desde todas as coleções de Java na biblioteca padrão estender AbstractCollection, presume-se que todos eles funcionam da mesma forma.

No entanto, a documentação desses métodos na interface Coleção não diz nada. É um suposto inferir a partir AbstractCollection, ou foi este deixado indeterminado com o propósito de permitir um para definir coleções que funcionam de forma diferente?

Por exemplo, Bag in apache-coleções afirma explicitamente que ele faz relação cardinalidade, e afirma que ela viola o contrato da versão da coleção (mesmo que ele realmente não).

Então, quais são os semântica dessas operações na coleção em vez de AbstractCollection?

Edit: Tho aqueles que estão se perguntando sobre por que eu teria cuidado, é porque como parte do meu Ph.D. trabalhar Eu demonstrei que os desenvolvedores não esperar que a violação conformidade no Apache, mas estou tentando entender por que a interface Collection foi deixado tão ambígua.

Foi útil?

Solução

Os javadocs para containsAll (na coleção) dizem:

Retorna: true se esta coleção contém todos os elementos do coleção especificada

e para retainAll (em Collection):

Mantém apenas os elementos nesta coleção que estão contidos no coleção especificada (opcional Operação). Em outras palavras, remove desta coleção toda a sua elementos que não estão contidos no coleção especificada.

Eu li o contrato de containsAll para significar que chamar a.containsAll (b) irá retornar true, se e somente se, a.contains chamando (Belém) para cada elemento Belém em b retornaria true. Também gostaria de levá-la para insinuar que a.containsAll (someEmptyCollection) também retornaria true. Como você indicar os javadocs para AbstractCollection mais explicitamente afirmar o seguinte:

Esta implementação itera sobre o coleção especificada, verificando cada elemento retornado pela iteração em virar para ver se ele está contido neste coleção. Se todos os elementos são tão continha verdade é devolvido, caso contrário, falsa.

Eu concordo que o contato para a coleção para containsAll sould ser mais explícito para evitar qualquer possibilidade de confusão. (E que a leitura dos javadocs para AbstractCollection não deveria ter sido necessário queridos confirmam entendimento da Collection)

Eu não teria feito uma suposição em relação ao número de elementos duplicados após uma chamada para retainAll. O contrato estipulado no colecção (pela minha leitura) não implica qualquer forma como duplicatas em qualquer coleção seria tratado. Com base na minha leitura de retainAll na recolha de vários resultados possíveis de a.retainAll (b) são razoáveis:

  1. resultado contém um de cada elemento que tem pelo menos uma cópia de ambos os a e b
  2. resultado contém cada elemento (incluindo duplicados) que foi em A, excepto aqueles que não estão em b
  3. ou mesmo, em algum resultado contém entre um e o número de cópias encontrado em um de cada elemento em um, excepto aqueles que não estão em b. Eu teria esperado tanto # 1 ou # 2, mas assumiria qualquer um dos três para ser legal com base no contrato.

Os javadocs para AbstractCollection confirmam que ele usa # 2:

Esta implementação itera sobre esta coleção, verificando cada elemento retornado pelo iterator em vez de ver se ele está contido no especificado coleção. Se ele não está tão contido, ele é removido desta coleção com método remove do iterador

Embora uma vez que este não é na minha leitura do contrato do interface de coleção original, eu não necessariamente assumir o comportamento da Colecção geralmente para ser desta forma.

Talvez você deve considerar a apresentação de alterações sugeridas para o JavaDoc uma vez que você está feito.

Quanto ao 'porquê a interface Collection foi deixado tão ambígua' - Eu duvido seriamente que foi intencionalmente feito -. Provavelmente apenas algo que não foi dada a devida prioridade quando essa parte da API do estavam sendo escritos

Outras dicas

Eu não acho Colecção define-lo desta maneira ou de outra, mas ele simplesmente se tornou uma espécie de convenção de seguir o comportamento AbstractCollection, por exemplo google-coleções fazer: ver sua documentação Multiset (Multiset é o que eles chamam de um saco)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top