Tutorial SCJP Java – #12 Immutable: String si Integer

3 comments - This post in english

Obiecte immutable (imuabile) sunt obiecte care nu isi pot schimba valoarea, odata ce acestea sunt create. Obiectul immutable cel mai cunoscut in Java este String. In afara de String, exista si alte obiect imuabile, iar unul dintre acestea este Integer (clasa si nu tipul primitiv), care are un comportament interesant pentru valori intre -128 si 127.

Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 – Cuprins.

Pe baza definitiei unui obiect immutable, daca doriti sa definiti propria clasa immutable (imuabila), aceasta poate arata astfel:

final clasa MyImmutable
{
    private  final  int valoare ; 	// definim atributul final - constant
    public MyImmutable(int valoare)
    {
        valoare = valoare;
    }
    public int getValue()  {
        returnare valoare;
    }
}

Clasa immutable

  • este definita final pentru a preveni mostenire si pentru a bloca modificarile ce pot avea loc prin supradefiniri;
  • atributul valoare este definit final pentru a bloca schimbarea valorii sale;
  • nu contine metode care sa permita modificari ale valorii atributului;

Am vazut in Tutorial Java SCJP – # 10 Cum sa utilizati String, StringBuilder si StringBuffer ca obiectele String:

  • sunt imuabile;
  • valorile lor sunt stocate in String constant pool atunci când se utilizeaza operatorul = pentru a initializa valoarea obiectului;
  • atunci când este folosit = , JVM creeaza un nou obiect String in String constant pool daca aceasta valoare nu a mai fost utilizata, altfel referinta ia valoarea adresei obiectului String.

Un alt tip de obiect immutable in Java, este Integer (exista si altele, cum ar fi Double, Color, …). In afara acestui lucru, exista o alta proprietate interesanta a clasei Integer.

Valorile intregi, cuprinse intre -128 si 127 sunt stocate de JVM intr-o zona similara cu String constant pool, deoarece aceste valori sunt folosite cu o frecventa ridicata.

Exemplul urmator va dovedi acest fapt:

	Integer i1 =100;            //foloseste valori constante
        Integer i2 =100;            //foloseste valori mici
 
        if(i1 == i2)        //compara referintele
            System.out.println("referintele sunt EGALE !");
        else
            System.out.println("referintele NU sunt egale!");
 
        i1 = 300;          //foloseste valori mai mari ca 127
        i2 = 300;
 
        if(i1 == i2)
            System.out.println( "referintele sunt EGALE !");
        else
            System.out.println("referintele NU sunt egale!")

Rularea codului sursa anterior genereaza:

referintele sunt EGALE !
referintele NU sunt egale!

In prima secventa de initializare, in care sunt utilizate valori intre -128 si 127, cele 2 referinte Integer sunt egale, deoarece acestea  refera (indica) acelasi obiect Integer.

Atunci când valorile sunt in afara intervalului -128 si 127, cele 2 referinte sunt diferite pentru ca avem doua obiecte diferite Integer cu aceeasi valoare.

Alte subiecte care fac parte din acest tutorial Java sunt accesibile prin intermediul Java Tutorial 6 – Cuprins .


  1. #1 by Alex B. on March 11th, 2011

    Va astept si cu alte tutoriale Java, in continuarea acestui set!

(will not be published)