2013-02-08 8 views
2

Je suis un peu confus au sujet de l'avis d'utiliser l'interface pour une classe Java, comme dans ce fil: Why should the interface for a Java class be preferred?Utilisation des interfaces sur les classes

Je comprends pourquoi vous voulez utiliser l'interface: si quelque chose change plus tard vous avez moins de code à nettoyer.

Mais n'y a-t-il pas des cas où l'utilisation de l'interface vous empêcherait de tirer parti de la performance, raison pour laquelle vous avez choisi cette classe en particulier? Par exemple, si j'ai une TreeMap, je suppose que je devrais être capable de localiser n'importe quel élément au maximum O (logn). C'est pourquoi il a de bonnes méthodes dont je peux tirer profit comme higherEntry(), lowerEntry(), lastEntry(). Si je référence à la place cette TreeMap comme une carte, maintenant je crois que je suis forcé d'itérer un élément à la fois à travers ma liste dans O (n) pour localiser cette entrée. Je suis nouveau à Java, alors laissez-moi savoir si quelque chose me manque ici.

Répondre

2

Si je fais référence à la place ce TreeMap comme une carte, maintenant je crois que je suis obligé de itérer un élément à la fois dans ma liste O (n) pour localiser cette entrée.

Non, vous n'êtes pas obligé de le faire. Si vous êtes sûr que votre référence Map tient une référence à TreeMap, et que vous voulez accéder à la méthode spécifique de TreeMap, alors vous pouvez toujours Typecast la référence Map à une référence TreeMap, puis accéder à la méthode appropriée, comme, higherEntry(), lowerEntry() . Mais, la seule mise en garde est que, vous devez être sûr que votre référence Map pointe vers un TreeMap, pour éviter d'avoir un ClassCastException lors de l'exécution.

Cela est sous-entendu par le fait que, une super class et il est sub classes sont covariant dans la nature. Ainsi, vous pouvez effectuer un cast entre eux, à condition que vous ne brisiez pas les règles lors de l'exécution (Ceci ayant la référence super class contenant la référence à une autre instance sub class, qui n'est pas covariante avec le sub class que vous lancez).

Maintenant, pour votre exemple, puisque le TreeMap implémente également l'interface NavigableMap, qui est une interface sous l'interface Map, vous pouvez donc l'utiliser au lieu de l'interface Map. Ainsi, vous pouvez avoir l'avantage du polymorphisme, sans avoir besoin de typer.

+0

Je vois. Oui, NavigableMap fournit toutes ces fonctionnalités. Donc, peut-être pour n'importe quel cas que je pourrais imaginer comme ceci une sous-interface existe? – vmayer

+0

@vmayer .. Eh bien, vous ne pouvez pas déduire un design particulier pour tous les cas qui cherchent jsut à un cas.Ce n'est pas dur et rapide, que vous pourriez avoir plusieurs interfaces convergeant toutes les méthodes de votre classe. Mais dans les cas maximum, oui, cela devrait être vrai. –

2

Si vous voulez utiliser des méthodes comme higherEntry, lowerEntry et lastEntry, puis il suffit d'utiliser l'interface NavigableMap au lieu de l'interface Map ou la classe TreeMap.

En général, utilisez des interfaces aussi souvent que possible, et utilisez l'interface la plus générale possible qui supporte toutes les opérations que vous souhaitez utiliser.

+0

Cela ne répond pas vraiment à sa question. Il a utilisé cela comme un exemple, pas un problème qu'il a. –

+1

Non, je pense que cela répond à la question. NavigableMap semble prendre en charge à la fois l'objectif de conception d'utiliser une interface et le problème de performance. – vmayer

Questions connexes