2012-04-13 13 views
9

"¿Por qué estás haciendo esto que es malo contigo?" no obstante, ¿hay alguna manera de lograr esto sin cambiar el nombre del parámetro del método final?¿Pueden los parámetros finales ser calificados de alguna manera para resolver conflictos de nombres con miembros de clase anónimos?

private Foo createAnonymousFoo(final Bar bar) { 
    return new Foo() { 
     private Bar bar = SomeUnknownScopeQualifier.bar; 

     public Bar getBar() { 
      return bar; 
     } 

     public void doSomethingThatReassignsBar() { 
      bar = bar.createSomeDerivedInstanceOfBar(); 
     } 
    }; 
} 

Obviamente, sin la llamada doSomethingThatReassignsBar, usted no necesitaría la barra de miembro y así sucesivamente. En este caso, la solución simple es cambiar final Bar bar a algo así como final Bar startBar y luego la asignación está bien. Pero, por curiosidad, ¿es posible referirse específicamente al final Bar (similar a la forma en que diría Super.this)?

+6

"¿Por qué estás haciendo esto lo que está mal contigo?" :) – jpm

+0

En realidad no es tan reprensible como te puedas imaginar. Creé un creador de documentos y estaba usando el patrón de visitante para escribir elementos, y en el caso de una hoja de cálculo simplemente estaba iterando sobre las células comenzando en "startCell" (el param final del método) y moviéndolos a través de 'cell = cell.nextCell() ', donde cell era la celda actual de ItemVisitor para escribir. –

Respuesta

7

Creo que la respuesta a su pregunta es "no". Desde el Java Language Specification:

Una variable local (§14.4), parámetro formal (§8.4.1), parámetro de excepción (§14.20), y la clase local (§14.3) sólo pueden ser referidos a la utilización de un nombre sencillo (§6.2), no es un nombre calificado (§6.6).

En otras palabras, no hay nada que pueda sustituir a SomeUnknownScopeQualifier con su código de ejemplo para hacer la instrucción de asignación en la clase interna se refiere al nombre del parámetro formal.

3

Creo que no es posible hacer eso. Cambie el nombre de las variables involucradas o cree un alias:

private Foo createAnonymousFoo(final Bar bar) { 
    final Bar alias = bar; 
    return new Foo() { 
    private Bar bar = alias; 

    // ... 
    }; 
} 
+0

Esto no es diferente de solo nombrar el parámetro del método 'alias'? –

+2

El nombre del parámetro del método podría estar disponible para herramientas de finalización de código o similares. Por lo tanto, es mejor tener el nombre autodocumentado en la API pública y usar un nombre distinto (aunque posiblemente críptico) internamente. – jpm

+0

Ese es un gran punto. He votado a favor de esto porque es una respuesta útil y perspicaz. La respuesta de Alex, sin embargo, cita el JLS y creo que debería aceptarlo. –

Cuestiones relacionadas