Question

Dans Java, je peux écrire du code comme celui-ci

Boolean b = true ;

Et cela fonctionnera. J'ai maintenant un objet qui contient la valeur "True".

Comment ça marche? Pourquoi ne dois-je pas passer la valeur par un constructeur? Ainsi:

Boolean b = new Boolean( true ) ;

Aussi, puis-je faire des classes personnalisées que je peux instancier de manière similaire? Si oui, comment cela s'appelle-t-il?

Pour que je puisse faire quelque chose comme ça:

Foobar foobar = "Test" ; 

Et donc avoir ma propre classe de wrapper.

Merci

Était-ce utile?

La solution

Non, vous ne pouvez pas faire ce dernier.

Le premier est appelé autoboxing et a été introduit dans Java V1.5 à Auto Wrap, primitives dans leur homologue en wrapper.

L'avantage de l'autoboxing pourrait être clairement vu lors de l'utilisation de génériques et / ou de collections:

De l'article: J2SE 5.0 en un mot

Dans le "Autoboxing et automatiquement des types primitifs" échantillon que nous avons:

Avant (l'autoboxing a été ajouté)

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue();

Après

 ArrayList<Integer> list = new ArrayList<Integer>();
 list.add(0, 42);
 int total = list.get(0);

Comme vous le voyez, le code est plus clair.

Gardez simplement à l'esprit la dernière note de la documentation:

Alors, quand devez-vous utiliser l'autoboxing et le déballage? Utilisez-les uniquement lorsqu'il existe un «décalage d'impédance» entre les types de référence et les primitives, par exemple, lorsque vous devez mettre des valeurs numériques dans une collection. Il n'est pas approprié d'utiliser l'autoboxing et le déballage pour l'informatique scientifique ou un autre code numérique sensible aux performances. Un entier ne remplace pas un INT; L'autoboxing et le déballage brouillent la distinction entre les types primitifs et les types de référence, mais ils ne l'éliminent pas.

Autres conseils

Comment ça marche?

C'est un compilateur. Le compilateur générera automatiquement l'opération de boxe. Ce qu'il fera réellement, c'est générer

Boolean.valueOf(true);

Parce que de cette façon, les instances existantes (immuables) boolean.true et boolean.false seront utilisées au lieu d'en créer une nouvelle.

C'est de la même manière que vous pouvez faire des objets de chaîne en tant que tels:

String s = "foobar"

C'est juste un avantage en Java, vraiment. Je ne sais pas pourquoi vous voudriez faire votre propre classe de wrapper, étant donné que tout type de données primitif a déjà un wrapper prédéfini ...

Cette fonctionnalité a été ajoutée à Java 1.5 et elle s'appelle Autoboxing. Ce type de magie disponible uniquement pour les valeurs primitives et les emballages correspondants.

Et vous ne pouvez pas le faire vous-même en Java. Si vous le voulez toujours, allez pour Scala - c'est bien! À savoir vous pouvez utiliser la fonctionnalité appelée Conversions implicites. Voici un petit exemple pour votre cas:

case class Foobar(value: String)
implicit def convertStringToFoobar(s: String) = Foobar(s)
val foobar: Foobar = "Test";

Non, c'est juste la magie du compilateur; il les traite comme des cas spéciaux (appelés autoboxing). Voir par exemple http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html.

C'est appelé autoboxing et c'est fondamentalement quelque chose que le compilateur fait pour vous. Il n'a été ajouté que dans Java 5, avant que vous ne deviez utiliser new Boolean( true ), ou mieux) Boolean.TRUE.

Et non, vous ne pouvez pas l'avoir pour vos propres classes, c'est fait uniquement pour les classes de wrapper primitives.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top