Foros del Web » Programación para mayores de 30 ;) » Java »

Duda de "teoría" respecto Variables Final

Estas en el tema de Duda de "teoría" respecto Variables Final en el foro de Java en Foros del Web. Buenas; Llevo unos días leyendo acerca de las variables de caracter "Final". Vengo de C, así que no me ha sido difícil entenderlo de forma ...
  #1 (permalink)  
Antiguo 16/12/2009, 05:57
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años
Puntos: 14
Duda de "teoría" respecto Variables Final

Buenas;

Llevo unos días leyendo acerca de las variables de caracter "Final". Vengo de C, así que no me ha sido difícil entenderlo de forma general tras la comparativa con los #define, constants etc.

Así, sabiendo que un "final int CANTIDAD_DE_COCHES = 10" me definiría una cantidad de coches = 10 para todo el programa, entiendo que una variable final es inmodificable.

Ahora mi duda es esta;

Estaba yo programando un campo JTextField en un método que recoje el tipeamiento, de forma que:

Código:
textInstruccio.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent arg0) {
			}
			public void keyReleased(KeyEvent arg0) {
			}
			public void keyTyped(KeyEvent arg0) {
				char teclaTipejada = arg0.getKeyChar();
				if (teclaTipejada == KeyEvent.VK_ENTER){
					novaNoticia("S'ha pulsat enter!");
					textInstruccio.setText("");
				}
			}
		});
Esto funcionaba, y tenía el textInstruccio definido GLOBALMENTE fuera del método. Pensaba que si borraba la definición global y declaraba el JTextField dentro del método, funcionaría igual, ya que nadie la usa fuera del mismo.

El caso es que al borrar la definición global y agregar la declaración en el método "JTextField textInstruccio = JTextField();", Java me pide que la defina como FINAL. Y me ha desconcertado, puesto que el JTextField puede modificarse, se usa, se "toca". Y no sé que Final tiene eso.

Código:
final JTextField textInstruccio = new JTextField(1);
		textInstruccio.addKeyListener(new KeyListener() {
			public void keyPressed(KeyEvent arg0) {
			}
			public void keyReleased(KeyEvent arg0) {
			}
			public void keyTyped(KeyEvent arg0) {
				char teclaTipejada = arg0.getKeyChar();
				if (teclaTipejada == KeyEvent.VK_ENTER){
					novaNoticia("S'ha pulsat enter!");
					textInstruccio.setText("");
				}
			}
		});
Gracias por leerme, y si se da el caso, por ayudarme ;)
  #2 (permalink)  
Antiguo 16/12/2009, 07:45
Avatar de dackiller  
Fecha de Ingreso: septiembre-2003
Ubicación: The Matrix
Mensajes: 341
Antigüedad: 20 años, 7 meses
Puntos: 4
Respuesta: Duda de "teoría" respecto Variables Final

Solución inmediata...
Código PHP:
JTextField textInstruccio = new JTextField(1);
        
textInstruccio.addKeyListener(new KeyListener() {
            public 
void keyPressed(KeyEvent arg0) {
            }
            public 
void keyReleased(KeyEvent arg0) {
            }
                       
// El parametro KeyEvent, devuelve el objeto que acciona el Evento.
            
public void keyTyped(KeyEvent arg0) {
                
char teclaTipejada arg0.getKeyChar();
/* Aqui te coloco el fragmento de codigo que va solucionarte el problema */
                                
JTextField textInstruccio = (JTextFieldarg0.getSource();
                if (
teclaTipejada == KeyEvent.VK_ENTER){
                    
novaNoticia("S'ha pulsat enter!");
                    
textInstruccio.setText("");
                }
            }
        }); 
Como verás, lo que hice fue tomar el objeto haciendo Cast desde KeyEvent ya que este devuelve el objeto que acciona el evento, en este caso, JTextField.

El IDE que uses es muy importante ya que te puede ayudar y ahorrar muchas horas de trabajo con este tipo de problemas que se nos escapan de tanto leer codigo, y aun más si trabajas en varios lenguajes.

"Mi mamá dice que estoy loco, que ¿cómo hago para leer todos esos simbolos?"

y tiene razón, llega un momento en que el cerebro no da más y empiezan a aparecer Excepciones y errores por cosas tontas... :P

Espero te sirva de ayuda.
__________________
--
NOTA: Si haz conseguido la solución a tu problema, por favor edita el titulo del tema colocando el prefijo [SOLUCIONADO], para que otros usuarios puedan encontrar soluciones más rápido.
  #3 (permalink)  
Antiguo 16/12/2009, 09:13
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda de "teoría" respecto Variables Final

Una variable final efectivamente no puede modificar su valor, pero hay que tener en cuenta que lo que no se puede modificar es únicamente la variable, y en el caso de apuntar a un objeto, la variable es el puntero al objeto. Así que no puedes hacer que la variable apunte a otro objeto, pero nada te impide modificar el objeto.

Es como decir, puedes escoger un coche y no puedes cambiar de coche, pero el conductor, la tapiceria, eso no te lo impide nadie, pero no puedes cambiar de coche, que no es lo mismo que no puedes cambiar el coche. Sutil, pero así es.

Los objetos que no se pueden cambiar internamente se llaman inmutables y en Java no hay palabra clave para definirlos, simplemente se restringen totalmente las modificaciones a los datos internos.

S!

PD: Ah, y Java te obliga a declarar como final las referencias externas a objetos que van a ser accedidas desde una clase anónima, por eso te pide que se lo pongas así.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:20.