Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utiliser types primitifs ou classe wrapper

11 août 2018 à 15:30:26

Bonjour, j'ai du du mal avec la nation de classe wrapper, je vois que les Objets Integer, Float, Double, Boolean, Character, Long, Byte,Short peuvent etre instancié directement, mais quand j'utilise un type primitif que ce passe t-il, vu que ce n'est aps un objet ce n'est qu'une allocation de memoire ?

faut-il utiliser les types primitifs ou alors utiliser les classes wrapper ? prenons un exemple :

int a = 22;
Integer b = new Integer(22);

ici b m'offriera les methodes de la classes Integer donc je pourrais faire des conversions (bien que je puisse faire des conversions avec des types primitifs), un objet sera également moins performants pour la machines.

Donc faut-il priviligier les types primitifs autant que faire ce peut et utiliser des objets des que ça devient necessaire ?

Merci :)

  • Partager sur Facebook
  • Partager sur Twitter
11 août 2018 à 17:38:35

Bonjour,

Les variables primitives, ça prend entre 1 et 8 octets suivant le type. Les wrappers, c'est 24 octets par objet.

L'accès est aussi un peu plus rapide pour les types primitifs.

L'intérêt des wrappers, c'est pour l'utilisation de types génériques comme dans les collections. Par exemple, on ne peut pas mettre de types primitifs dans des listes, maps, sets, etc.

Donc quand c'est juste pour des calculs ou stocker une valeur, mieux vaut des types primitifs. Si c'est pour utiliser un type générique, les wrappers sont obligatoires.

Petite parenthèse, pour créer un wrapper, mieux vaut utiiliser la méthode "valueOf". new crée un nouvel objet à tous les coups alors que "valueOf" peut retourner des objets existants (pour les petits entiers mis en cache) pour éviter de gaspiller de la mémoire.

  • Partager sur Facebook
  • Partager sur Twitter
11 août 2018 à 18:12:21

Bonjour.

La mémoire est effectivement un facteur différenciant les 2.
Voir message de brubru777.
Cependant la mémoire est rarement un des critères dans les programmes : ce critère technique devra être utilisé lorsqu'il y a un réel intérêt.

La performance est également un facteur.
Les 2 raisons sont : l'autoboxing/unboxing et le "suivi de pointeur" (accès indirect à la valeur).
Cependant ce coût est à mettre en corrélation avec le reste du programme (rendre un code bogué/non-maintenable/... pour 0,001% de performance est idiot).

Pour moi la grand différence est l'aspect nullable.
En effet, un type primitif est initialisé avec la valeur 0 (ou false).
Dans mes POJO (@Entity, DTO, ...) j'utilise toujours des types primitifs (avec validateur de non-nullité) : si j'oublie d'initialiser la propriété alors ça plante, ce qui mieux que de les laisser s'auto-initialiser avec une valeur par défaut ce qui provoquerait un comportement inattendu.

  • Partager sur Facebook
  • Partager sur Twitter
Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)