Pregunta

Vamos a decir que tengo una clase como esta:

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

Muchas de las otras clases en mi solicitud están utilizando estas opciones. Ahora, quiero cambiar una de las opciones solo y desplegar sólo la clase compilada. Pero si estos campos están en alineados en las clases de consumidores esto se convierte en derecho imposible?

¿Hay alguna opción para desactivar la en-guarnición de constantes de tiempo de compilación?

¿Fue útil?

Solución

Puede utilizar String.intern () para obtener el efecto deseado, pero debe comentar su código, porque no mucha gente sabe acerca de esto. es decir.

public static final String configOption1 = "some option".intern();

Esto evitará que la línea de tiempo de compilación. Dado que se está refiriendo a la misma cadena exacta que el compilador colocará en la permanente, no está creando nada extra.

Como alternativa siempre se puede hacer

public static final String configOption1 = "some option".toString();

Sin embargo, esto no va a utilizar la cadena intern'd compilado, se creará una nueva en la vieja generación. No hay una gran gran cosa, y podría ser más fácil de leer. De cualquier manera, ya que es un poco extraño que debe comentar el código para informar a las que mantienen que lo que está haciendo.

Editar Encontrado otro SO enlace que da referencias al JLS, para más información sobre esto. Cuando usar pasante () en literales de cadena

Otros consejos

No, es parte de la JLS, me temo. Esto es tocado, brevemente, en Puzzlers Java, pero no tengo mi copia a mano.

supongo que podría considerar tener estas constantes definidas en un archivo de propiedades, y tener la clase que las carga periódicamente.

Referencia: http: //java.sun. com / docs / libros / JLS / third_edition / html / expressions.html # 5313

No. Se podría reemplazarlos con una llamada al método estático, sin embargo, como:

class ApplicationDefs {

    public static String configOption1() { return "some option"; }

}

Por supuesto, no es hermoso pero sería cumplir con sus requerimientos. :)

En realidad, si eliminar la palabra clave final las constantes dejar de ser constantes en tiempo de compilación y entonces su configuración funcionará como usted desee.

Sin embargo, se sugiere fuertemente que si esto es de hecho una especie de configuración que está tratando de hacer, debe mover a una forma más manejable que las constantes en algún archivo de clase.

Se puede inhibir procesos en línea al hacer que su constante no compilar constantes de tiempo ...

Por ejemplo, null no es una constante de tiempo de compilación. Cualquier expresión que implica un no-tiempo de compilación constante no es una constante de tiempo de compilación, aunque javac puede hacer de plegado constante dentro de la unidad de compilación.

public static final String configOption1 = null!=null?"": "some option";

No hay nada aquí que dice que estos valores deben ser inline. Usted se acaba declarando algunas public, miembros static. Esas otras clases están utilizando los valores de estos miembros. No se le pide procesos en línea. Incluso la palabra clave final

Sin embargo, por razones rendimiento , algunas JVM puede línea estos valores en las otras clases. Esta es una optimización. Sin optimización debe cambiar el comportamiento de un programa. Por lo que si se cambia la definición de estos miembros, la JVM debe no-inline los valores anteriores.

Esta es la razón por la que no hay manera de convertir inlining fuera. O bien la JVM no coloca en línea y no hay ningún problema o si se colocarán en línea, la JVM garantiza la no-procesos en línea.

No estoy seguro de lo que sucede cuando se importa estáticamente esta clase. Creo (no estoy seguro) la expansión en línea se lleva a cabo y puede causar el problema que mencionas. Si ese es el caso, podría básicamente elimina la importación estática y estás bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top