2012-06-25 10 views
7

Supongamos que tenemos el siguiente bloque de código:variables Declarar a ser de cierto tipo

if (thing instanceof ObjectType) { 
    ((ObjectType)thing).operation1(); 
    ((ObjectType)thing).operation2(); 
    ((ObjectType)thing).operation3(); 
} 

Todo el encasillamiento hace que el código se ven feos, hay una manera de declarar 'cosa' como ObjectType dentro de ese bloque de código? Sé que podría hacer

OjectType differentThing = (ObjectType)thing; 

y trabajar con 'differentThing' a partir de entonces, pero que trae cierta confusión al código. ¿Hay una manera más agradable de hacer esto, posiblemente, algo así como

if (thing instanceof ObjectType) { 
    (ObjectType)thing; //this would declare 'thing' to be an instance of ObjectType 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 

Estoy bastante seguro de que esta pregunta se ha hecho en el pasado, no pude encontrar que aunque. Siéntase libre de señalarme el posible duplicado.

+1

No creo que haya otra manera aparte de la manera que usted ha mencionado. – nhahtdh

Respuesta

9

No, una vez que se declara una variable, el tipo de esa variable es fijo. Creo que al cambiar el tipo de una variable (potencialmente temporalmente) traería confusión mucho más que el:

ObjectType differentThing = (ObjectType)thing; 

enfoque que creemos que es confuso. Este enfoque es ampliamente utilizado e idiomático, donde se requiere, por supuesto. (Esto es típicamente un poco de olor a código.)

Otra opción es extraer un método:

if (thing instanceof ObjectType) { 
    performOperations((ObjectType) thing); 
} 
... 

private void performOperations(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
4

Una vez se declara una variable, que es de tipo no puede cambiar. Su enfoque differentThing es la correcta:

if (thing instanceof ObjectType) { 
    OjectType differentThing = (ObjectType)thing; 
    differentThing.operation1(); 
    differentThing.operation2(); 
    differentThing.operation3(); 
} 

Yo no diría que es confuso, ya sea: siempre que el alcance de la variable differentThing se limita al cuerpo del operador if, es claro para los lectores Que esta pasando.

2

Lamentablemente, esto no es posible.

La razón es que "cosa" en este ámbito siempre será del mismo tipo de objeto, y no puede volver a convertirlo dentro de un bloque de código.

Si no le gusta tener dos nombres de variables (como thing y castedThing), siempre puede crear otra función;

if (thing instanceof ObjectType) { 
    processObjectType((ObjectType)thing); 
} 
.. 

private void processObjectType(ObjectType thing) { 
    thing.operation1(); 
    thing.operation2(); 
    thing.operation3(); 
} 
Cuestiones relacionadas