Clasele acoperitoare de tip

În pachetul java.lang, pentru fiecare din tipurile de date primitive există o clasă acoperitoare de tip (engleză: Type Wrapper). Aceste clase pun la dispoziția programatorului atât variabile finale (constante), cât și metode necesare pentru a lucra cu tipul de date respectiv. Clasele acoperitoare de tip formează ierarhia din figura 1.

- Figura 1 -

În aceasta figură, clasele acoperitoare de tip sunt reprezentate cu negru. Clasa  Number este o clasa abstractă, din care sunt derivate toate  clasele acoperitoare pentru tipuri de date numerice. Fiecare din celelalte clase acoperă un anumit tip de date primitiv. Clasa Character acoperă tipul  char, iar clasa  Integer acoperă tipul  int. Toate celelalte clase acopera tipul primitiv al carui nume îl poartă. Spre deosebire de numele tipurilor primitive, care sunt scrise cu litere mici, numele claselor acoperitoare încep (ca la orice alte clase) cu majuscule.

Toate clasele acoperitoare sunt clase finale, deci din ele nu mai pot fi derivate alte clase.

Fiecare instanță a unei clase acoperitoare conține un câmp de date nestatic în care se pastrează o valoare  aparținând tipului primitiv de date corespunzator clasei respective. De exemplu, un obiect din clasa Boolean conține un câmp de tip boolean care, la rândul lui, conține valoarea logică true sau false. În mod similar, un obiect din clasa Double conține un câmp de tip double în care există un număr în virgulă mobilă în dublă precizie.

În afară de câmpul de date nestatic, fiecare clasă acoperitoare conține mai multe câmpuri de date statice finale, în care se păstrează diferite constante (variabile finale) specifice tipului de date corespunzător.

Unele dintre metode sunt prezente în toate clasele acoperitoare, altele sunt specifice fiecărei clase sau unui grup de astfel de clase. Prezentăm aici succint principalele metode prezente în toate clasele:

    public boolean equals(Object obj) - este o redefinire a metodei equals()din clasa Object ; compară obiectul propriu cu obiectul  obj primit ca argument și întoarce true dacă acestea sunt identice, sau false în caz contrar;
    public String toString() - este o redefinire a metodei  toString() din clasa  Object ; întoarce valoarea primitivă conținută în obiectul respectiv, convertită într-un șir de caractere, reprezentând forma externă a valorii respective;
    public int hashCode() - este o redefinire a metodei hashCode() din clasa  Object; intoarce codul de dispersie al obiectului propriu.

Clasele acoperitoare oferă, de asemenea, metode prin care se pot converti datele din tipurile respective din forma externă (de șiruri de caractere) în cea interna și invers.
 

Clasa Boolean

Clasa Boolean acoperă tipul primitiv boolean. Clasa are doi constructori publici: Boolean(boolean value) și Boolean(String s). Primul primește ca argument o expresie cu valoare de tip boolean, iar al doilea primește un șir de caractere, care conține forma externă a unei valori de tip boolean.

În afara de metodele equals(),  toString()  și  hashCode(), care au fost deja menționate, clasa Boolean mai oferă următoarele metode specifice: 
    public boolean booleanValue() - întoarce valoarea primitivă de tip boolean conținută în obiectul propriu; 
    public static Boolean valueOf(String s) - întoarce o noua instanță a clasei boolean, corespunzătoare șirului s: dacă șirul s este "True" întoarce TRUE, altfel întoarce FALSE. Are, practic, același efect cu aplicarea operatorului new cu constructorul Boolean(String s)

Clasa Boolean moștenește, de asemenea, metodele clasei Object

În programul din fișierul TestBoolean.java este testată clasa Boolean
 

Clase acoperitoare pentru tipurile de date numerice

Clasa abstractă Number

Este superclasa tuturor tipurilor de date numerice, cu excepția tipului char.Contine următoarele metode:
    public abstract byte byteValue() - întoarce numărul convertit la tipul primitiv  byte,  ceeace poate avea ca efect rotunjirea sau trunchierea;
    public abstract short shortValue() - întoarce numărul convertit la tipul primitiv  short, ceeace poate avea ca efect rotunjirea sau trunchierea;
    public abstract int intValue() - întoarce numărul convertit în tipul primitiv  int, ceeace poate avea ca efect rotunjirea;
    public abstract long longValue() - întoarce numărul convertit la tipul primitiv long, ceeace poate avea ca efect rotunjirea;
    public abstract float floatValue() - întoarce numarul convertit la tipul primitiv float;
    public abstract double doubleValue() - întoarce numarul convertit la tipul primitiv double.

Remarcăm că aceste metode se aplica tuturor claselor acoperitoare pentru numere, realizând conversia numărului conținut într-o instanță a unei clase acoperitoare numerice către tipul primitiv dorit de utilizator.
 

Clasele  Byte, Short, Integer și Long

Instanțele acestor clase acoperă valori din tipurile primitive byte, short, int și long.  Între aceste clase există o mare asemănare în ce priveăte câmpurile de date statice și metodele. Vom prezenta aci principalele facilități oferite de clasa Integer. Pentru o prezentare completă a acestei clase, cât și pentru informații privind celelalte clase, recomandăm consultarea documentației originale Java API. Menționăm că majoritatea metodelor statice din clasa Integer nu există în celelalte clase acoperitoare pentru tipuri de date intregi, dar nici nu este necesar, deoarece se pot folosi aceste metode și cu argumente efective de tip byte sau short.

Clasa Integer este clasa acoperitoare pentru tipul primitiv  int. Clasa conține următoarele câmpuri de date statice:

    public static final int MAX_VALUE - conține valoarea maximă pentru tipul de date  int, adică valoarea  2147483647;
    public static final int MIN_VALUE - conține valoarea minimă pentru tipul de date  int, adică -2147483648;
    public static final Class TYPE - conține un obiect din clasa Class cu informații despre tipul primitiv int.

Clasa are doi constructori:

    public Integer(int value) - construiește instanța clasei Integer care conține valoarea primitivă value;
    public Integer(String s) - convertește șirul s, primit ca argument, într-un număr de tip int și construiește obiectul Integer care conține acest număr; dacă șirul s nu reprezintă forma externă a unui număr întreg, se obține excepția NumberFormatException. Remarcăm deci că se face analiza sintactică a șirului s pentru a se verifica dacă acesta este cu adevărat un număr întreg.

Clasa oferă un numeroase metode, atât de instanță, cât și statice, care sunt utile când se lucrează cu numere întregi. Dintre acestea menționăm:

    a/ metodele  equals(), toString() și hashCode() existente în toate clasele acoperitoare;

    b/ metodele  byteValue(), shortValue(), intValue(), longValue(), floatValue()si doubleValue() existente în toate subclasele clasei Number;

    c/ metode statice, utile în diverse operații cu numere întregi:
    public static int parseInt(String s) - face analiza sintactică a șirului s, considerat ca forma externă a unui număr întreg în sistemul de numerație zecimal, și întoarce valoarea de tip int corespunzatoare; dacă șirul s nu are forma corectă a unui număr întreg, se obține excepția NumberFormatException;
 
    public static int parseInt(String s, int radix) - acționeaza asemănător cu metoda precedentă, cu deosebirea că se consideră că șirul s este un număr în sistemul de numerație cu baza  radix; 
    public static String toBinaryString(int i) - întoarce numărul întreg i convertit într-un șir care îl reprezintă în sistemul de numerație binar; 
    public static String toHexString(int i) - întoarce numărul întreg i convertit într-un șir hexazecimal; 
    public static String toOctalString(int i) - întoarce numărul întreg i convertit într-un șir în sistemul de numerație octal; 
    public static String toString(int i) - întoarce numărul întreg i convertit într-un șir în sistemul de numerație zecimal (se deosebește de metoda toString(), moștenită de la clasa Object, prin faptul ca nu este o metodă a instanței, ci una statică); 
    public static String toString(int i, int radix) - întoarce un șir care conține numărul intreg i convertit în sistemul de numerație cu baza  radix; 
    public static Integer valueOf(String s) - acționează asemănător cu metoda parseInt(String s), dar întoarce un obiect din clasa Integer; 
    public static Integer valueOf(String s, int radix) - similara cu metoda precedentă, dar se consideră că șirul s este un număr întreg în baza de numerație  radix; 
    public static Integer decode(String s) - analizează șirul s și îl decodifică; dacă acesta respectă unul din formatele admise pentru numere întregi, adică este forma externă a unui număr întreg în unul din sistemele zecimal, hexazecimal (incepe cu 0x) sau octal (incepe cu 0), atunci il convertește în valoare internă de tip int și întoarce obiectul de clasa Integer care contine aceasta valoare; altfel, întoarce excepția NumberFormatException. 

    d/ metode ale instanței (în plus, față de cele menționate la punctele a/ și b/):

    public int compareTo(Integer anotherInteger) - compară propriul obiect din clasa Integer cu obiectul anotherInteger primit ca argument. Dacă ele sunt egale, întoarce zero; daca întregul propriu este mai mic decât argumentul, întoarce o valoare negativă, iar dacă este mai mare întoarce o valoare pozitivă;
    public int compareTo(Object obj) - dacă obiectul-argument  obj este tot un  Integer, atunci această metodă acționează la fel cu cea precedentă; altfel, se obține excepția  ClassCastException.

Exemplu:
     Programul din fișierul  TestInt.java testează utilizarea unora dintre metodele clasei Integer. Executând acest program se poate constata că analiza sintactică a șirului primit ca argument decurge în același mod la metodele parseInt(String), valueOf(String) și la constructorul Integer(String). Se acceptă numai șirurile care reprezintă cu adevărat numere întregi cuprinse în domeniul de valori al tipului int. Se admite ca numărul să fie precedat de semnul - (minus), dar nu de semnul +. Se observă, de asemenea, că la conversia de la Integer către byte sau short este posibil să se piardă cifrele cele mai semnificative prin trunchiere.

Clasele Float și Double

Instanțele claselor Float și  Double "acoperă" valori ale tipurilor primitive corespunzătoare, respectiv  float și double. Ele oferă, de asemenea, metode de conversie a șirurilor în numere reale (cu analiza sintactică corespunzătoare) și a numerelor reale în șiruri. Vom prezenta aici clasa  Double,  dar aceleași facilități există și în clasa Float.

Câmpuri de date statice:

Clasa Double (și similar clasa Float) oferă următoarele câmpuri de date statice:
    public static final double MAX_VALUE - cea mai mare valoare pozitivă de tip double;
    public static final double MIN_VALUE - cea mai mică valoare pozitivă de tip double;
    public static final double NaN       - valoarea NaN (Not a Number) pentru tipul double;
    public static final double POSITIVE_INFINITY - valoarea Infinitypentru tipul double;
    public static final double NEGATIVE_INFINITY - valoarea  -Infinity pentru tipul double;
    public static final Class TYPE - un obiect din clasa Class cu informații despre tipul primitiv double.

Constructori:

Clasa  Double are doi constructori:
    Double(double value) - construiește o instanță a clasei  Double care conține valoarea primitivă  value;
    Double(String s) - construiește o instanță a clasei  Double care conține valoarea primitivă de tip double a cărei formă externă este șirul  s primit ca argument; dacă acest șir nu este corect sintactic, se obtine excepția NumberFormatException.

Metode:

Clasa  Double oferă numeroase metode utile în lucrul cu date de tip  double, dintre care mentionăm:

    a/ metodele  equals(), toString() si hashCode() existente în toate clasele acoperitoare;

    b/ metodele  byteValue(), shortValue(), intValue(), longValue(), floatValue() si doubleValue() existente în toate subclasele clasei Number;

    c/ metode statice, utile în diverse operații cu numere reale:
    public static double parseDouble(String s) - analizează sintactic șirul  s primit ca argument și - dacă este corect - întoarce valoarea primitivă  double corespunzatoare; altfel generează excepția NumberFormatException;
    public static String toString(double d) - convertește în sir numărul primitiv primit ca argument;
 
    public static Double valueOf(String s) - acționeaza asemănător cu metodă parseDouble(String), dar intoarce un obiect din clasa Double; 
    public static long doubleToLongBits(double value) - întoarce o valoare de tip  long care este reprezentarea pe 64 biți, conform standardului IEEE 754, a numărului de tip  double primit ca argument; 
    public static double longBitsToDouble(long bits) - întoarce o valoare de tip double, a cărei reprezentare ca long (întreg pe 64 biți) conform standardului IEEE 754 este cea primită ca argument; 
    public static boolean isInfinite(double v) - întoarce  true dacă argumentul v este infinit; 
    public static boolean isNaN(double v) - întoarce  true dacă argumentul v este NaN; 

    d/ metode ale instanței (în plus, față de cele menționate la punctele a/ și b/):
 
    public int compareTo(Double anotherDouble) - compară propriul obiect din clasa  Double cu obiectul anotherDouble primit ca argument; dacă ele sunt egale, întoarce zero; dacă numărul propriu este mai mic decât argumentul întoarce o valoare negativă, iar dacă este mai mare întoarce o valoare pozitivă; 
    public int compareTo(Object obj) - dacă obiectul-argument  obj este tot un  Double, atunci această metodă acționează la fel cu cea precedentă; altfel, se obține excepția  ClassCastException. 
    public boolean isInfinite() - întoarce true dacă valoarea conținută în obiectul propriu este infinită; 
    public boolean isNaN() - întoarce  true dacă valoarea conținuta în obiectul propriu este NaN; 

Exemplu:
     Programul din fișierul TestDouble.java testează principalele metode ale clasei Double. Remarcăm că, în acest caz, a fost considerat corect și un sir care reprezintă un număr real precedat de semnul +. Pentru reprezentarea formatului intern al numărului s-a folosit metoda doubleToLongBits(), combinată cu metodele toBynaryString() și toHexString()din clasa Long.

Clasa Character

Fiecare obiect al clasei Character "acoperă" o valoare primitiva de tip char.  În plus, clasa Character oferă metode utile în lucrul cu caractere. Reamintim că, în limbajul Java, caracterele sunt reprezentate pe 16 biți, în sistemul Unicode.

Câmpuri statice:

Clasa Character conține numeroase câmpuri de date statice, prezentate în documentația Java API. Cele mai multe dintre ele sunt coduri numerice ale diferitelor categorii de caractere (litere majuscule, litere minuscule, cifre zecimale, simboluri matematice etc), folosite în metodele care verifică dacă un anumit caracter corespunde categoriei respective. Printre ele există însă și câmpul
    public static final Class TYPE
care conține un obiect din clasa  Class cu informații despre tipul primitiv char.

Constructori:

Clasa  Character are un singur constructor
    public Character(char value) - construiește un obiect al clasei Character care conține caracterul primit ca argument.
 
Metode statice:

Clasa  Character oferă numeroase metode statice utile în lucrul cu caractere, dintre care menționăm: 
    public static boolean isDigit(char ch) - întoarce  true dacă argumentul  ch este cifră; 
    public static boolean isLetter(char ch) - întoarce  true dacă argumentul este literă; 
    public static boolean isLowerCase(char ch) - întoarce true dacă ch este literă mică; 
    public static boolean isUpperCase(char ch) - întoarce  true daca  ch este literă majusculă; 
    public static boolean isLetterOrDigit(char ch) - verifică dacă  ch este  literă sau cifră; 
    public static boolean isWhitespace(char ch) - verifică dacă  ch este un spațiu liber sau un alt caracter asimilabil acestuia, de exemplu caracter de trecere la linie nouă, de întoarcere a carului, de tabulare orizontală sau verticală, de separare a fișierelor sau înregistrărilor etc (vezi documentația). 
    public static boolean isSpaceChar(char ch) - verifică dacă  ch este caracterul spațiu; 
    public static char toLowerCase(char ch) - întoarce caracterul ch convertit în litera mică; dacă nu este literă, îl lasă neschimbat; 
    public static char toUpperCase(char ch) - întoarce caracterul ch convertit în litera majusculă; dacă nu este literă, îl lasă neschimbat; 
    public static int getNumericValue(char ch) - întoarce valoarea numerica Unicode a caracterului ch ca un întreg nenegativ; 
    public static int digit(char ch, int radix) - întoarce valoarea numerică a caracterului  ch considerat ca cifra a sistemului de numerație cu baza  radix; dacă în sistemul respectiv nu există o astfel de cifră, întoarce -1; 
    public static char forDigit(int digit, int radix) - întoarce caracterul prin care este reprezentată cifra de valoare digit în sistemul de numerație cu baza  radix; daca în sistemul respectiv nu exista o asemenea cifră, întoarce caracterul nul ('\u0000'); 

Metode nestatice:

În afara de metodele generale  equals(), toString() și  hashCode(), clasa Character oferă, de asemenea, următoarele metode: 
    public char charValue() - întoarce caracterul primitiv conținut în obiectul propriu din clasa Character
    public int compareTo(Character anotherCharacter) - compară caracterul din propriul obiect cu cel primit ca argument și întoarce valoare nulă dacă sunt egale, negativă daca primul este mai mic decât al doilea și valoare pozitivă dacă este mai mare; 
    public int compareTo(Object obj) - dacă argumentul  obj este un obiect din clasa Character, actionează similar cu metoda precedentă; altfel generează excepția ClassCastException; 

Exemplu:
În fișierul TestChar.java este dat un program de testare a metodelor oferite de clasa Character.
 

Clasa Void

Clasa Void nu este instanțiabilă (nu poate avea obiecte) și "acoperă" tipul primitiv  void. Ea conține numai un singur câmp static 
    public static final Class TYPE 
care conține un obiect din clasa  Class cu informații despre tipul primitiv void. 



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați