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

Uso de Static Final

Estas en el tema de Uso de Static Final en el foro de Java en Foros del Web. Disculpen, es q soy nuevo en Java y deseo acr un atributo constante (cn final) q sea static. El problema es que primero necesito instanciarlo ...
  #1 (permalink)  
Antiguo 07/10/2010, 23:42
Avatar de suta123  
Fecha de Ingreso: octubre-2010
Mensajes: 47
Antigüedad: 14 años, 1 mes
Puntos: 0
Pregunta Uso de Static Final

Disculpen, es q soy nuevo en Java y deseo acr un atributo constante (cn final) q sea static.

El problema es que primero necesito instanciarlo y luego, mediante un metodo darle su valor definitivo.

necesito algo así:

Código:
public static final int MiConstante;

public void crearConstante(int pValor){
        MiConstante = pValor;
    }
pero Java no me lo permite,

agradeceré un ayuda.

Última edición por suta123; 08/10/2010 a las 00:10
  #2 (permalink)  
Antiguo 08/10/2010, 01:39
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: Uso de Static Final

Pues sí que está liado el asunto.

Veamos 3 opciones posibles:

1º Quieres inicializar un int, pero un int te obliga a darle un valor. Entonces... Haz que tu variable sea un string y trabaja con ella parseandola (haciendo un cast) a int --> int tuIntDeTrabajo = Integer.parseInt(tuString);
Recuerda que en este caso debes controlar cualquier posible excepción, como que lo que tienes en el String no pueda ser parseable a int.

2º Si lo anterior no funciona, puedes obviar lo de final y tratarla como si fuese variable, aunque le des un único valor. Si quieres hacer un control específico puedes tener una clase de control que contenga una constante que tú conozcas y una variable que adquiera el mismo valor que la constante, y en el método que utilizas para dar valor a la final static modificas la variable de esa clase control con un aleatorio, luego a cada acceso al método compruebas si ya se ha utilizado, ya que no coincidirían, y bloqueas la modificación en esos casos.

3º La última opción es más complicada e implica el uso de reflection, y se trataría de generar dinámicamente una clase java entera y compilarla... aunque esto sería una auténtica locura :P
  #3 (permalink)  
Antiguo 08/10/2010, 01:44
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Uso de Static Final

Si el valor fuese realmente constante, no tendrías un método para asignarle un valor, ya que eso hace que el valor pueda variar.

Así que Java no te deja por que lo intentas hacer no tiene mucho sentido .
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #4 (permalink)  
Antiguo 08/10/2010, 15:41
Avatar de suta123  
Fecha de Ingreso: octubre-2010
Mensajes: 47
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Uso de Static Final

Creo que la solución a mi problem es la 2da opcion de Fuzzylog:

Cita:
Iniciado por Fuzzylog Ver Mensaje
2º Si lo anterior no funciona, puedes obviar lo de final y tratarla como si fuese variable, aunque le des un único valor. Si quieres hacer un control específico puedes tener una clase de control que contenga una constante que tú conozcas y una variable que adquiera el mismo valor que la constante, y en el método que utilizas para dar valor a la final static modificas la variable de esa clase control con un aleatorio, luego a cada acceso al método compruebas si ya se ha utilizado, ya que no coincidirían, y bloqueas la modificación en esos casos.



Cita:
Iniciado por GreenEyed Ver Mensaje
Si el valor fuese realmente constante, no tendrías un método para asignarle un valor, ya que eso hace que el valor pueda variar.
GreenEyed el asunto es q necesito asignarle su valor una unica vez, y te quede inmodificable
  #5 (permalink)  
Antiguo 09/10/2010, 03:04
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 21 años, 1 mes
Puntos: 51
Respuesta: Uso de Static Final

Si escribes un método para asignarle valor, entonces el compilador no puede asegurar que sólo lo vas a usar una vez y por tanto no te deja asignarle el atributo final. Eso es lo que no tiene sentido.

Si le puedes asignar el valor con un método, no puedes decirle al compilador que es una constante por que no lo puedes asegurar.

Así que la tienes que tratar como una variable y asegurarte tu por programa que no le das valor más que una vez. Pero no puedes poner final como atributo.
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #6 (permalink)  
Antiguo 09/10/2010, 09:35
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 10 meses
Puntos: 57
Respuesta: Uso de Static Final

Código:
public static final int MiConstante;

public void crearConstante(int pValor){
        MiConstante = pValor;
    }
Por que no inicializas la variable directamente en la linea donde la declaras?
Si ese valor lo obtienes de alguna otra parte como BD, archivo de configuracion, parametro, etc. podrias asignarle el valor en el static initializer. El static initializer solo se ejecuta una vez (cuando la clase es leida/necesaria por primera vez).

Este codigo utiliza clase con una variable static final y su valor se le asigna la primer vez que es necesaria la clase (linea 17). El programa puede recibir un parametro (de tipo entero) que se utiliza para inicializar la variable temp. Lo que ocurre es que cuando quieres imprimir el valor de MiConstante (linea 17), se ejecuta el static initializer de la clase Otraclase

Código Java:
Ver original
  1. import java.util.Date;
  2.  
  3. class Otraclase {
  4.     public static final int MiConstante;
  5.  
  6.     static {
  7.         MiConstante = Miclase.temp;
  8.         System.out.println("Static: " + new Date());
  9.     }
  10. }
  11. public class Miclase {
  12.     public static int temp;
  13.  
  14.     public static void main(String[] args) {
  15.         temp = Integer.parseInt(args[0]);
  16.         System.out.println(Otraclase.MiConstante);
  17.     }
  18. }
  #7 (permalink)  
Antiguo 09/10/2010, 10:09
Avatar de suta123  
Fecha de Ingreso: octubre-2010
Mensajes: 47
Antigüedad: 14 años, 1 mes
Puntos: 0
De acuerdo Respuesta: Uso de Static Final

Cita:
Iniciado por posman Ver Mensaje

Por que no inicializas la variable directamente en la linea donde la declaras?
Si ese valor lo obtienes de alguna otra parte como BD, archivo de configuracion, parametro, etc. podrias asignarle el valor en el static initializer. El static initializer solo se ejecuta una vez (cuando la clase es leida/necesaria por primera vez).

Este codigo utiliza clase con una variable static final y su valor se le asigna la primer vez que es necesaria la clase (linea 17). El programa puede recibir un parametro (de tipo entero) que se utiliza para inicializar la variable temp. Lo que ocurre es que cuando quieres imprimir el valor de MiConstante (linea 17), se ejecuta el static initializer de la clase Otraclase
graxxx... me funciona perfectamente.

Etiquetas: constante, final, static, atributos
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 14:26.