{"id":4495,"date":"2020-04-25T13:06:28","date_gmt":"2020-04-25T11:06:28","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4495"},"modified":"2020-04-25T13:06:28","modified_gmt":"2020-04-25T11:06:28","slug":"was-ist-eine-compile-time-constant-expression","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2020\/04\/was-ist-eine-compile-time-constant-expression\/","title":{"rendered":"Was ist eine compile-time constant expression?"},"content":{"rendered":"\n<p>Sind Variablen final, hei\u00dft das lediglich, dass es eine einmalige Zuweisung geben darf. Ob die Werte allerdings zur Laufzeit berechnet werden oder nicht, hat erst einmal nichts mit final zu tun. In folgendem Beispiel ist die Variable eine zur Compilezeit bekannte Konstante:<\/p>\n\n\n\n<p>public class Finance {<br \/>&nbsp; public static final int TAX = 19;<br \/>}<\/p>\n\n\n\n<p>Greift eine andere Klasse auf die Variable TAX zu, ist das im Quellcode nicht als direkter Variablenzugriff Finance.TAX kodiert, sondern der Compiler hat das Literal 19 direkt an jeder Aufrufstelle eingesetzt. Dies ist eine Optimierung des Compilers, die er laut Java-Spezifikation vornehmen kann.<\/p>\n\n\n\n<p>Wir sprechen in diesem Zusammenhang von einer <em>compile-time constant expression<\/em>\u00a0wenn gilt:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>ein Attribut ist final,<\/li><li>der Datentyp ist ein primitiver oder String,<\/li><li>das Attribut wird mit einer vom Compiler berechneten Konstanten initialisiert.<\/li><\/ul>\n\n\n\n<p>Das Einsetzen der konstanten Werte ist praktisch, bringt aber ein Probleme mit sich, wenn das finale Attribut sich \u00e4ndert. Dann muss n\u00e4mlich auch jede Klasse \u00fcbersetzt werden, die Bezug auf die Konstante hatte. Werden die abh\u00e4ngigen Klassen nicht neu \u00fcbersetzt, ist in ihnen immer noch der alte Wert eincompiliert.<\/p>\n\n\n\n<p>Die L\u00f6sung ist, die bezugnehmenden Klassen neu zu \u00fcbersetzen und sich am besten anzugew\u00f6hnen, bei einer \u00c4nderung einer Konstanten gleich alles neu zu compilieren. Ein anderer Weg transformiert die finale Variable in eine sp\u00e4ter initialisierte Form:<\/p>\n\n\n\n<p>public class Finance {<br \/>&nbsp; public static final int TAX = Integer.valueOf( 19 );<br \/>}<\/p>\n\n\n\n<p>Die Initialisierung findet im statischen Initialisierer statt, und die Konstante mit dem Literal 19 ist zun\u00e4chst einmal verschwunden. Der Compiler wird also beim Zugriff auf Finance.TAX keine Konstante 19 vorfinden und daher das Literal an den Aufrufstellen nicht einbauen k\u00f6nnen. In der Klassendatei wird der Bezug Finance.TAX vorhanden sein, und eine \u00c4nderung der Konstanten erzwingt keine neue \u00dcbersetzung der Klassen.<\/p>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n","protected":false},"excerpt":{"rendered":"<p>Sind Variablen final, hei\u00dft das lediglich, dass es eine einmalige Zuweisung geben darf. Ob die Werte allerdings zur Laufzeit berechnet werden oder nicht, hat erst einmal nichts mit final zu tun. In folgendem Beispiel ist die Variable eine zur Compilezeit bekannte Konstante: public class Finance {&nbsp; public static final int TAX = 19;} Greift eine [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-4495","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4495","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=4495"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4495\/revisions"}],"predecessor-version":[{"id":4496,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4495\/revisions\/4496"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}