Às vezes, “programar para interfaces” introduz exceções de tempo de execução possíveis (e evitáveis)?

5

Por favor, considere o com.google.common.collect.ImmutableMap

A programação para sua interface, Map , cria um bug que pode explodir no tempo de execução da seguinte forma:

Map<String, Integer> myMap = ImmutableMap.copyOf(justSomeMap);
myMap.put(key, val); // bang. runtime error.

Nesse caso, a idéia de "programar para a interface e não se preocupar com a classe de implementação" introduz um possível bug de tempo de execução.

O autor do método de fábrica ImmutableMap reconheceu isso e fez do tipo de retorno uma classe, não uma interface. Os métodos que alteraram o Map foram preteridos em ImmutableMap , permitindo assim que o compilador emita avisos.

  • Tudo o que eu disse acima está correto?

Em seguida, uma nova interface ImmutableMapInterface poderia ter sido criada facilmente para a classe ImmutableMap . ImmutableMapInterface seria exatamente Mapa , mas sem os métodos que permitiriam que ImmutableMap fosse alterado. Se houvesse ImmutableMapInterface , você pode manter a programação em interfaces.

Então, por que não há ImmutableMapInterface ? Eu vou adivinhar o motivo é apenas conveniência. Concordo. Criar uma interface para cada classe única soa um pouco extremo demais. certo?

    
por red shoe 24.03.2015 / 03:09
fonte

1 resposta

7

Java faz isso em algumas ocasiões e é uma abominação ao homem.

Esse tipo de coisa é uma violação do livro-texto do Princípio de Substituição de Liskov, que leva ao tipo de bugs que você descreve. O código bem escrito não faz isso.

Você está certo de que criar uma interface para cada classe é um absurdo. Você precisa usar um pouco de pragmatismo para decidir o que fazer uma interface e o que não fazer. A outra coisa a lembrar é que o conselho existia nos dias C, C ++. "Programa para uma interface" não significa literal interface em Java ou C #. Funciona tão bem com web apis ou protocolos da Internet ... Aqui, uma interface é um comportamento garantido / exposto, não a implementação subjacente.

    
por 24.03.2015 / 03:37
fonte