2010-09-23 37 views

Respuesta

14

Encuentro una necesidad de utilizar ejemplos de consejos sobre el mal diseño. Es una señal segura de que se seguirá una gran y compleja construcción estilo interruptor. La mayoría de las veces que lo veo utilizado, debemos usar el polimorfismo en lugar de instanceof. Ver el patrón de Estrategia. (relevant examples of use)

La única vez que encuentro que necesito usarlo es cuando implemento equals(Object o).

+0

En realidad, Strategy consiste en decidir qué se debe hacer según un criterio conocido (como el tipo, por ejemplo) pero enviar tipos desconocidos en diferentes ramas de código usando polimorfismo, el patrón utilizado es [Visitor] (http: // es .wikipedia.org/wiki/Visitor_pattern) –

+0

IMO instanceof es mejor que el polimorfismo en situaciones de casos especiales donde un método tiene sentido en una sola subclase, y la clase padre y/u otras subclases se verían obligadas a implementar métodos stub que no tienen sentido en su contexto. Incluso entonces, uno debe tratar de llamar al método de caso especial de un método heredado, pero si eso es engorroso, entonces el uso de instanceof está perfectamente justificado. –

0

Cuando conozca el objeto que se está pasando, no necesita usarlo. Si hay alguna ambigüedad involucrada (como dos clases que implementan la misma interfaz), se aconseja utilizar instanceof antes de seguir adelante.

4

Lanzar desde un tipo base a un tipo derivado es algo malo. Si usa instandofil de esa manera, se considera un mal diseño porque es difícil de mantener y leer. Ver http://www.javapractices.com/topic/TopicAction.do?Id=31.

Usando instanceof para iguales() porque tiene un object que debería ser su tipo, es una buena práctica.

3

Un buen caso de uso sería verificar interfaces de marcador como RandomAccess.

0

Usar instanceof al anular el método de Object es igual, ya que dos objetos no pueden ser iguales si son de tipos diferentes. Rara vez me encuentro con otra situación en la que se requiere instanceof, tal vez si se requiere downcasting pero se puede lanzar una ClassCastException.

Cuestiones relacionadas