2017-11-06 2 views
2

Die Klasse Integer ist ein Wrapper des primitiven Typs int (https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html). Ein Objekt wird als unveränderlich betrachtet, wenn sich sein Zustand nach der Erstellung nicht ändern kann (https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html).Final, unveränderliche Objekte sind keine Konstanten?

Was ich hier verstehe ist, dass Sie den Wert einer Integer Variable nur ändern können, indem Sie auf ein völlig anderes Integer Objekt verweisen.

Durch eine variable final erklären wir können die versichern folgende:

Once a final variable has been assigned, it always contains the same value. If a final variable holds a reference to an object, then the state of the object may be changed by operations on the object, but the variable will always refer to the same object.

Wieder einmal von der immutable Dokumentation:

An object is considered immutable if its state cannot change after it is constructed.

So eine letzte, würde unveränderlich Integer nicht erlaubt werden, um seine zu ändern Wert mit allen Mitteln.

Wenn das richtig ist, warum sind wir nicht berechtigt, eine public static final Integer Variable zu deklarieren?

Die following code deklariert eine public static final Integer auf unterschiedliche Weise, und alle von ihnen eine Kompilierung Fehler zurück:

import java.util.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    public class Constants { 
     public static final String STRING_CONSTANT = "string_constant"; 
     public static final int INTEGER_CONSTANT = 1; // allowed 
     //public static final Integer INTEGER_CONSTANT = 1; // not allowed 
     //public static final Integer INTEGER_CONSTANT = new Integer("1"); // not allowed 
     //public static final Integer INTEGER_CONSTANT = Integer.valueOf(1); // not allowed 
    } 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     System.out.println("STRING_CONSTANT = " + Constants.STRING_CONSTANT); 
     System.out.println("INTEGER_CONSTANT = " + Constants.INTEGER_CONSTANT); 
    } 
} 

Die geworfene Ausnahme ist:

Main.java:12: error: Illegal static declaration in inner class Ideone.Constants 
     public static final Integer INTEGER_CONSTANT = 1; 
            ^
    modifier 'static' is only allowed in constant variable declarations 
1 error 

Kann mir jemand erklären, warum sind wir nicht darf bitte eine public static final Integer deklarieren?

EDIT: Ich bin interessiert zu wissen, warum public static final Integer nicht erlaubt ist, während public static final String und public static final int sind, nicht über das Finden eines Codes, der kompiliert.

+6

Ihre Frage zeigt nicht die Tatsache, dass Sie eine statische Instanz in einer inneren Klasse deklarieren möchten. ** Die Tatsache, dass Sie in dieser inneren Klasse primitive Konstante deklarieren können, intrigiert mich! ** – AxelH

+10

Ihre Klasse 'Konstanten' ist eine nicht statische innere Klasse. Es kann keine statischen Mitglieder haben. – khelwood

+0

Danke für Ihre Kommentare. In diesem Fall, warum können wir einen öffentlichen statischen finalen String und einen öffentlichen statischen final int deklarieren? – Bernat

Antwort

3

Sie können den Grund für diese in der JLS finden.

8.1.3. Inner Classes and Enclosing Instances

It is a compile-time error if an inner class declares a member that is explicitly or implicitly static, unless the member is a constant variable (§4.12.4).

Dann können wir die Definition einer konstanten Variablen überprüfen:

4.12.4. final Variables

A constant variable is a final variable of primitive type or type String that is initialized with a constant expression

diesem Grund sollten Sie eine primitive oder eine String konstant zu erklären sind erlaubt . Aber die Integer Klasse und andere Boxen Klasse sind nicht Teil dieser Ausnahme, das sind Instanzen wie jede andere Klasse.

Quelle: Andy Thomas

Konstante Inline

Wenn wir hinzufügen, dass mit den folgenden:

13.1. The Form of a Binary

A reference to a field that is a constant variable (§4.12.4) must be resolved at compile time to the value V denoted by the constant variable's initializer.

Wir können sehen, dass diese Konstante nicht wirklich existieren Zur Laufzeit werden die Referenzen zur Kompilierungszeit aufgelöst.

Code:

final static int INTEGER_CONSTANT = 1; 
int value = INTEGER_CONSTANT; 

Laufzeit "Code":

int value = 1; 
4

Das Problem ist nicht die Deklaration der Konstante, sondern die Tatsache, dass sie in einer inneren Klasse deklariert ist, die nicht statisch ist. Ändern Sie die Deklaration der Klasse als statisch und Sie sind gut:

public static class Constants { 
    public static final String STRING_CONSTANT = "string_constant"; 
    public static final int INTEGER_CONSTANT = 1; // allowed 
    public static final Integer INTEGER_CONSTANT1 = 1; 
    public static final Integer INTEGER_CONSTANT2 = new Integer("1"); 
    public static final Integer INTEGER_CONSTANT3 = Integer.valueOf(1); 
} 
+0

Danke für Ihre Antwort. Allerdings suche ich nicht nach einer Lösung für den Code, sondern aus dem Grund, warum Integer nicht erlaubt ist und String/int sind. – Bernat

-1

Schauen Sie sich Ihre Definition an. Es ist kein Problem der statischen endgültigen Ganzzahl. Aber innere (verschachtelte) Klasse. Die innere Klasse ist standardmäßig die Eigenschaft der übergeordneten Klasse und macht, was zu tun ist. Wenn Sie diese Funktionalität für andere sichtbar machen möchten, machen Sie die innere Klasse statisch und Ihr Code funktioniert. Aber wenn Sie eine globale Konfigurationsklasse verwenden möchten, deklarieren Sie sie nicht als Unterklasse.

0

Java erlaubt public static final Integer, aber nicht innerhalb nicht statische innere Klassen. Verschieben Sie die Deklaration in die Klasse Ideone oder machen Sie die Klasse Konstanten statisch. Sie können public static final Felder in inneren Klassen nur deklarieren, wenn die Initialisierung als Compiler-Konstante betrachtet wird, die nur mit String und den Primaten-Typen funktioniert.

public static final String a = new String("ds"); //will not work

Verwandte Themen