Java Integer - Immutable [closed]

-1

Non riesco a capire la definizione. Ecco un codice:

Integer iW;
for (iW = 1; iW < 4; iW++)
   System.out.println(iW);
int i = iW;
iW += 6;
System.out.println(String.format("iW = %d, i = %d", iW , i));

Emette questo:

1
2
3
iW = 10, i = 4

Che cosa sta succedendo, esattamente? Oggetto intero IW sembra che stia cambiando per me. In altri usi, in realtà sembra comportarsi un po 'più come un oggetto locale (non una variabile di riferimento / tipo puntatore), se posso piegare la mia vecchia mente C ++ a questo. Ma è sicuro che sembra mutabile.

P.S. Grazie per tutti i voti negativi senza spiegazione perché! In realtà ho letto di ogni post su questo argomento prima di fare questa domanda. Integer è una classe immutabile, e le risposte strongmente potenziate suggeriscono (almeno ai miei occhi) che questo significa che non puoi mutare, cioè cambiare, un'istanza della classe . Tuttavia, l'esempio di codice sopra sembra mostrare che l'oggetto iW , o l'oggetto a cui fa riferimento, si muove. Voglio ancora sapere quale classe immutabile significa in Java, specialmente dal punto di vista della codifica, poiché non impedisce la apparente mutazione di istanze di classe immutabili.

    
posta Kloder 16.02.2016 - 04:23
fonte

2 risposte

2

Guarda un po 'di codice.

public class Ints {
    public static void main(String[] args) {
        Integer iW;
        for (iW = 1; iW < 4; iW++)
            System.out.println(iW);
        int i = iW;
        iW += 6;
        System.out.println(String.format("iW = %d, i = %d", iW , i));
    }
}

Questo dovrebbe essere piuttosto familiare. Ma ora, vediamo cosa compila e decompila in:

public class Ints {
    public Ints() {
    }

    public static void main(String[] args) {
        Integer iW;
        for(iW = Integer.valueOf(1); iW.intValue() < 4; iW = Integer.valueOf(iW.intValue() + 1)) {
            System.out.println(iW);
        }

        int i = iW.intValue();
        iW = Integer.valueOf(iW.intValue() + 6);
        System.out.println(String.format("iW = %d, i = %d", new Object[]{iW, Integer.valueOf(i)}));
    }
}

E lì vedi che succede - la conversione di Integer in int e viceversa.

La linea che hai pensato era iW += 6 è in realtà iW = Integer.valueOf(iW.intValue() + 6);

Questo è un processo noto come boxing (che è un tutorial Java di Oracle - piuttosto buona lettura).

Autoboxing is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes. For example, converting an int to an Integer, a double to a Double, and so on. If the conversion goes the other way, this is called unboxing.

Questo è fatto dal compilatore per te. Rende il codice più facile da scrivere. E fintanto che non stai facendo le cose non dovresti (come confrontare l'uguaglianza tra interi con == che può morderti nel posteriore piuttosto difficile), facendo ciò che vuoi tu.

Se accendi un debugger vedrai questi oggetti creati o richiamati da altre fonti.

Sulla mia macchina, quando iW è 1, l'oggetto reale è Integer@426 sotto le scene. Quando iW è 2, l'oggetto effettivo è Integer@432 e così via. Non ho modificato Numero intero @ 426 (valore = 1) quando viene incrementato - piuttosto viene creato un nuovo oggetto che ha un valore superiore.

Ciò che in realtà è immutabile è che non puoi fare iW.setValue(10) . Questo non funziona. Non è possibile modificare lo stato dell'oggetto a cui punta iW. Con l'autoboxing, puoi modificare rapidamente e facilmente l'oggetto a cui stai puntando, ma l'oggetto sottostante non può essere modificato.

La stringa è immutabile - anche se la funzione abominio di String foo = "foo"; foo += "bar"; funziona (in realtà è più coinvolgente della magia Integer poiché significa allocare un nuovo StringBuilder). Guarda anche BigInteger, Color o InetAddress. Cerca i metodi che ti consentiranno di mutare lo stato dell'oggetto che hai. Questo è ciò che significa immutabile.

    
risposta data 17.02.2016 - 01:44
fonte
-3

iW non è un oggetto, è una variabile che contiene un riferimento a oggetti diversi. Modifiche di riferimento, gli oggetti vengono creati e referenziati, senza necessità di modifiche.

    
risposta data 16.02.2016 - 05:45
fonte

Leggi altre domande sui tag