outer method inner java inner-classes final

method - outer java



La variable local final no se puede asignar, ya que se define en un tipo adjunto (4)

Bueno, el truco estándar es usar una matriz int de longitud uno. Haz la var final y escribe a var[0] . Es muy importante asegurarse de no crear una carrera de datos. Usando su código como ejemplo:

final int[] vote = {0}; class SliderMoved implements ChangeListener { public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); } }

Dado que todo esto sucederá en el EDT, incluida la invocación de devolución de llamada, debe estar seguro. También debe considerar el uso de la clase anónima:

ratingS.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { vote[0] = ratingS.getValue(); } });

ratingS = new JSlider(1, 5, 3); ratingS.setMajorTickSpacing(1); ratingS.setPaintLabels(true); int vote; class SliderMoved implements ChangeListener { public void stateChanged(ChangeEvent e) { vote = ratingS.getValue(); } } ratingS.addChangeListener(new SliderMoved());

Si escribo el código anterior Eclipse me dice esto:

No se puede referir a un voto variable no final dentro de una clase interna definida en un método diferente

Pero si agrego final antes de int vote , me da este error:

La votación de la variable local final no se puede asignar, ya que se define en un tipo adjunto

Entonces, ¿cómo resolver?


Establecer el nivel de cumplimiento del compilador en 1.8 funcionó para que yo resolviera un problema similar. No entiendo la razón, pero puedes intentar esto.

Cómo funciona:

Haga clic derecho en el proyecto -> Propiedades -> Compilador Java. Y en la ventana de propiedades del compilador Java, establezca el nivel de cumplimiento del compilador en 1.8.


Finalmente resolví declarar voto como variable de instancia (privada) en la clase principal.


Mueve el vote a SliderMoved :

class SliderMoved implements ChangeListener { private int vote; public void stateChanged(ChangeEvent e) { this.vote = ratingS.getValue(); // do something with the vote, you can even access // methods and fields of the outer class } public int getVote() { return this.vote; } } SliderMoved sm = new SliderMoved(); ratingS.addChangeListener(sm); // if you need access to the actual rating... int value = rattingS.getValue(); // ...or int value2 = sm.getVote();

EDITAR

O alternativamente, pase una clase modelo al oyente de cambios

public class Person { private String name; private int vote; public int getVote() { return this.vote; } public void setVote(int vote) { this.vote = vote; } // omitting other setter and getter }

Person se utiliza de la siguiente manera:

class SliderMoved implements ChangeListener { private Person person; public SliderMoved(Person person) { this.person = person; } public void stateChanged(ChangeEvent e) { this.person.setVote(ratingS.getValue()); } public Person getPerson() { return this.person; } } Person person = new Person(); ratingS.addChangeListener(new SliderMoved(person)); // access the vote int vote = person.getVote();