Question

Disons que j'ai un cours comme ceci:

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";
}

De nombreuses autres classes de mon application utilisent ces options. Maintenant, je veux modifier l'une des options seules et déployer uniquement la classe compilée. Mais si ces champs sont en ligne dans les classes de consommation, cela devient impossible, non?

Existe-t-il une option pour désactiver la ligne de la ligne des constantes de temps de compilation?

Était-ce utile?

La solution

Vous pouvez utiliser String.intern () pour obtenir l'effet souhaité, mais vous devez commenter votre code, car peu de gens le savent. c'est à dire

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

Cela empêchera le temps de compilation en ligne. Puisqu'il fait référence à la même chaîne exacte que le compilateur placera dans la permanente, vous ne créez rien de plus.

En tant qu'alternative, vous pouvez toujours faire

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

Cependant, cela n'utilisera pas la chaîne interne compilée, elle en créera une nouvelle sur l'ancienne génération. Pas un gros problème, et pourrait être plus facile à lire. Quoi qu'il en soit, comme c'est un peu étrange, vous devez commenter le code pour informer ceux qui le maintiennent ce que vous faites.

Éditer:Trouvé un autre lien SO qui fait référence au JLS, pour plus d'informations à ce sujet.Quand utiliser Intern () sur les littéraux de chaîne

Autres conseils

Non, ça fait partie du JLS, j'ai peur. Ceci est abordé, brièvement, dans Java Puzzlers mais je n'ai pas ma copie à la main.

Je suppose que vous pourriez envisager de faire défini ces constantes dans un fichier de propriétés et d'avoir la classe qui les charge périodiquement.

Référence: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

Non. Vous pouvez les remplacer par un appel de méthode statique, cependant, comme:

class ApplicationDefs {

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

}

Certes, ce n'est pas beau mais cela répondrait à vos besoins. :)

En fait, si vous retirer le final mot-clé Les constantes cessent d'être des constantes de compilation et de votre configuration marchera comme tu veux.

Cependant, il est fortement suggéré que s'il s'agit bien d'une sorte de configuration que vous essayez de faire, vous devez passer à une manière plus gérable que les constantes dans un fichier de classe.

Vous pouvez inhiber en inclinaison en faisant vos constantes de temps non compiles constantes ...

Par exemple, null n'est pas une constante de temps de compilation. Toute expression impliquant une constante de temps non compile n'est pas une constante de temps de compilation, bien que Javac puisse faire une pliage constant dans l'unité de compilation.

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

Il n'y a rien ici qui dit que ces valeurs devraient être inclinées. Vous en déclarez juste public, static membres. Ces autres classes utilisent les valeurs de ces membres. Aucune inclinaison n'est demandée. Même le final mot-clé

Mais pour raisons de performance, certains JVM peuvent en ligne ces valeurs dans ces autres classes. Il s'agit d'une optimisation. Aucune optimisation ne devrait modifier le comportement d'un programme. Donc, si vous modifiez la définition de ces membres, le JVM devrait non en ligne les valeurs précédentes.

C'est pourquoi il n'y a aucun moyen de désactiver. Soit le JVM n'est pas en ligne et il n'y a pas de problème, soit s'il est incliné, le JVM garantit la non-instruction.

Je ne sais pas ce qui se passe lorsque vous importez statiquement cette classe. Je pense que (pas sûr) l'inclinaison est effectuée et peut causer les problèmes que vous mentionnez. Si tel est le cas, vous pouvez essentiellement supprimer l'importation statique et vous allez bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top