Quand devrais-je opter pour la classe wrapper sur les types primitifs? Ou Dans quelles circonstances dois-je choisir entre les types wrapper / Primitive?
98
Quand devrais-je opter pour la classe wrapper sur les types primitifs? Ou Dans quelles circonstances dois-je choisir entre les types wrapper / Primitive?
Réponses:
D'autres ont mentionné que certaines constructions telles que
Collections
nécessitent des objets et que les objets ont plus de surcharge que leurs homologues primitifs (mémoire et boxe).Une autre considération est:
Il peut être pratique d'initialiser des objets
null
ou d'envoyer desnull
paramètres dans une méthode / un constructeur pour indiquer l'état ou la fonction. Cela ne peut pas être fait avec des primitives.De nombreux programmeurs initialisent les nombres à 0 (par défaut) ou -1 pour signifier cela, mais selon le scénario, cela peut être incorrect ou trompeur.
Cela mettra également en scène un
NullPointerException
moment où quelque chose est mal utilisé, ce qui est beaucoup plus convivial pour les programmeurs que certains bogues arbitraires sur toute la ligne.la source
En général, vous devriez utiliser des types primitifs à moins que vous n'ayez besoin d' un objet pour une raison quelconque (par exemple pour mettre dans une collection). Même dans ce cas, envisagez une approche différente qui ne nécessite pas d'objet si vous souhaitez maximiser les performances numériques. Cela est conseillé par la documentation et cet article montre comment l'auto-boxing peut provoquer une grande différence de performances.
la source
Integer
est plus lisible queint
.À mon avis, si les membres de ma classe sont des variables wrapper, cela ne dépend pas des valeurs par défaut, ce qui est un comportement convivial pour les développeurs.
1.
2.
Dans le premier cas, vous ne pouvez pas conserver la valeur SSN non initialisée. Cela peut être douloureux si vous ne vérifiez pas si la valeur a été définie avant d'essayer de l'utiliser.
Dans le second cas, vous pouvez garder le SSN initialisé avec null. Ce qui peut conduire à NullPointerException, mais c'est mieux que d'insérer sans le savoir des valeurs par défaut (zéro) en tant que SSN dans la base de données chaque fois que vous essayez de l'utiliser sans initialiser le champ SSN.
la source
PersonBuilder
qui lève une exception si le SSN n'est pas défini avant d'appeler "build" pour obtenir l'Person
instance. Je pense que ce genre de chose est excessif, mais c'est ce que le langage Java promeut pour des modèles appropriés.Je n'utiliserais les types de wrapper que si vous le devez.
En les utilisant, vous ne gagnez pas grand-chose, à part le fait qu'ils le sont
Objects
.Et, vous perdez des frais généraux dans l'utilisation de la mémoire et le temps passé à boxer / déballer.
la source
Pratiquement j'avais rencontré une situation où l'utilisation de la classe wrapper peut être expliquée.
J'ai créé une classe de service qui avait une
long
variable de typelong
- lorsqu'elle n'est pas initialisée, elle sera définie sur 0 - ce sera déroutant pour l'utilisateur lorsqu'elle sera affichée dans l'interface graphiqueLong
- lorsqu'elle n'est pas initialisée, elle sera définie surnull
- cette valeur nulle n'apparaîtra pas dans l'interface graphique.Cela s'applique
Boolean
également là où les valeurs peuvent être plus déroutantes lorsque nous utilisons une primitiveboolean
(car la valeur par défaut est false).la source
Les collections sont le cas typique pour les objets wrapper Java simples. Cependant, vous pouvez envisager de donner au Wrapper une signification plus spécifique dans le code (objet de valeur).
À mon humble avis, il y a presque toujours un avantage à utiliser des objets de valeur quand cela se résume à la lisibilité et à la maintenance du code. L'emballage de structures de données simples à l'intérieur d'objets lorsqu'ils ont certaines responsabilités simplifie souvent le code. C'est quelque chose de très important dans la conception pilotée par domaine .
Il y a bien sûr le problème de la performance, mais j'ai tendance à l'ignorer jusqu'à ce que j'aie la possibilité de mesurer la performance avec des données appropriées et de faire des actions plus dirigées vers la zone problématique. Il peut également être plus facile de comprendre le problème de performances si le code est également facile à comprendre.
la source
les performances des applications dominées par les calculs numériques peuvent grandement bénéficier de l'utilisation de primitives.
types primitifs, on utilise l'opérateur ==, mais pour le wrapper, le choix préféré est d'appeler la méthode equals ().
"Les types primitifs sont considérés comme nuisibles" parce qu'ils mélangent "la sémantique procédurale dans un modèle orienté objet par ailleurs uniforme.
De nombreux programmeurs initialisent les nombres à 0 (par défaut) ou -1 pour signifier cela, mais selon le scénario, cela peut être incorrect ou trompeur.
la source
Si vous souhaitez utiliser des collections, vous devez utiliser des classes Wrapper.
Les types primitifs sont utilisés pour les tableaux. De plus, pour représenter des données sans comportement, par exemple, un compteur ou une condition booléenne.
Depuis l'autoboxing, la frontière "quand utiliser une primitive ou un wrapper" est devenue assez floue.
Mais rappelez-vous que les wrappers sont des objets, vous bénéficiez donc de toutes les fonctionnalités Java sophistiquées. Par exemple, vous pouvez utiliser la réflexion pour créer des objets Integer, mais pas des valeurs int. Les classes wrapper ont également des méthodes telles que valueOf.
la source
Si vous souhaitez créer un type valeur. Quelque chose comme un ProductSKU ou AirportCode.
Lorsqu'un type primitif (chaîne dans mes exemples) définit l'égalité, vous voudrez remplacer l'égalité.
la source
Les valeurs primitives en Java ne sont pas des objets. Afin de manipuler ces valeurs en tant qu'objet, le package java.lang fournit une classe wrapper pour chacun des types de données primitifs.
Toutes les classes Wrapper sont finales. L'objet de toutes les classes wrapper qui peuvent être initiées est immuable, ce qui signifie que la valeur de l'objet wrapper ne peut pas être modifiée.
Bien que la classe void soit considérée comme une classe wrapper, elle n'englobe aucune valeur primitive et n'est pas initiable. Il n'a pas de constructeur public, il désigne simplement un objet de classe représentant le mot-clé void.
la source