Frage

Nehmen wir an, ich habe eine solche Klasse:

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

Viele der anderen Klassen in meiner Anwendung verwenden diese Optionen. Jetzt möchte ich eine der Optionen allein ändern und nur die kompilierte Klasse einsetzen. Aber wenn diese Felder in den Verbraucherklassen abgekleidet sind, wird dies unmöglich, oder?

Gibt es eine Option, um die Auskleidung von Kompilierungszeitkonstanten zu deaktivieren?

War es hilfreich?

Lösung

Sie können String.Intern () verwenden, um den gewünschten Effekt zu erzielen, sollten aber Ihren Code kommentieren, da nicht viele Leute darüber wissen. dh

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

Dadurch wird die Kompilierzeit inline verhindern. Da es sich auf die genaue Zeichenfolge bezieht, die der Compiler in die Perm platziert, erstellen Sie nichts mehr.

Als Alternative könnten Sie immer tun

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

Dies wird jedoch nicht die kompilierte Praktikant -Zeichenfolge verwenden, sondern eine neue im alten Gen. Keine große große Sache und könnte einfacher zu lesen sein. In beiden Fällen sollten Sie den Code kommentieren, um diejenigen zu informieren, die ihn beibehalten, was Sie tun.

Bearbeiten:Es gab einen weiteren Link, der Verweise auf die JLS gibt, um weitere Informationen dazu zu erhalten.Wann ist Praktikant () auf String -Literalen zu verwenden

Andere Tipps

Nein, es ist Teil des JLS, fürchte ich. Dies wird kurz in Java -Puzzler berührt, aber ich habe meine Kopie nicht zur Hand.

Ich denke, Sie könnten in Betracht ziehen, diese Konstanten in einer Eigenschaftendatei zu definieren und die Klasse zu haben, die sie regelmäßig lädt.

Bezug: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

Nein. Sie können sie jedoch durch einen statischen Methodenaufruf ersetzen, wie:

class ApplicationDefs {

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

}

Zugegeben, es ist nicht schön, aber es würde Ihre Anforderung erfüllen. :)

Eigentlich wenn Sie entferne das final Stichwort Die Konstanten hören auf Kompilierzeitkonstanten und dann Ihre Konfiguration auf wird funktionieren wie Sie möchten.

Es wird jedoch stark vorgeschlagen, dass Sie, wenn dies tatsächlich eine Art Konfiguration ist, die Sie versuchen, auf eine überschaubare Weise als Konstanten in einer Klassendatei übergehen sollten.

Sie können die Inlines hemmen, indem Sie Ihre ständigen nicht kompilen Zeitkonstanten machen ...

Zum Beispiel, null ist keine Kompilierungszeitkonstante. Jeder Ausdruck, der eine nicht kompile Zeitkonstante beinhaltet, ist keine Kompilierungszeitkonstante, obwohl Javac innerhalb der Kompilierungseinheit konstante Faltung durchführt.

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

Hier gibt es nichts, was besagt, dass diese Werte eingebaut werden sollten. Sie erklären nur einige public, static Mitglieder. Diese anderen Klassen verwenden die Werte dieser Mitglieder. Es wird keine Einbrüche gefragt. Sogar die final Stichwort

Aber für Leistungsgründe, einige JVMs können in der Reihe Diese Werte in diesen anderen Klassen. Dies ist eine Optimierung. Keine Optimierung sollte das Verhalten eines Programms verändern. Wenn Sie also die Definition dieser Mitglieder ändern, sollte die JVM Un-inline die vorherigen Werte.

Deshalb gibt es keine Möglichkeit, sich zu verteilen. Entweder ist der JVM nicht inline und es gibt kein Problem, oder wenn er eingebaut ist, garantiert der JVM die Unbekämpfung.

Ich bin mir nicht sicher, was passiert, wenn Sie diese Klasse statisch importieren. Ich denke (nicht sicher), dass die Einbeziehung durchgeführt wird, und kann die Schwierigkeiten verursachen, die Sie erwähnen. Wenn dies der Fall ist, können Sie den statischen Import im Grunde genommen löschen und es ist Ihnen in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top