Question

J'ai entendu parler de types appelés "boxed". dans certaines langues.

En Java, j'ai entendu parler de "sélection automatique". Qu'est-ce que c'est? At-il des classes wrapper pour un type? Comment mon code changerait-il si je travaille avec des types en boîte ou sans boîte?

Était-ce utile?

La solution

Certains types de données sont considérés comme des "primitives", ce qui signifie qu'ils ne sont pas traités comme des objets et ne possèdent pas les propriétés d'un objet.

Sur la plupart des plateformes, les entiers et les caractères sont des exemples de types primitifs mais pouvant être mis en boîte.

Boxer signifie les envelopper dans un objet pour qu’ils aient le comportement d’un objet.

La signification exacte et le comportement dépendent de la langue que vous utilisez. Certaines langues (telles que Smalltalk ... du moins quand je le faisais ...) n'autorisent aucun type primitif et considèrent tout comme un objet, mais il y a une pénalité de performance associée à cela car, à la fin de la journée, le processeur doit travailler avec des nombres bruts et de la mémoire brute pour effectuer un travail utile. Si vous souhaitez ajouter deux entiers qui ont été encadrés, par exemple, en coulisse, ils sont "non encadrés". Dans les types primitifs, les nombres sont ajoutés, puis ils sont replacés dans un nouvel entier.

Autres conseils

Informations plus spécifiques à Java:

La sélection automatique permet à Java de convertir automatiquement des éléments tels que booléen et int en leurs versions d'objet Boolean et Entier automatiquement dans la plupart des cas. Cela permet également l'inverse.

Par exemple:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

Les anciennes versions de Java qui n'ont pas d'auto-sélection nécessiteront que ce code fasse la même chose:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

Cependant, il existe certains scénarios dans lesquels vous devez toujours faire les choses manuellement. Par exemple, imaginez que vous ayez une classe avec deux méthodes telles que:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

Maintenant, si vous essayez de faire ceci:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

La raison pour laquelle cela ne fonctionne pas, c'est parce qu'il ne sait pas s'il doit décocher un dans un int ou une boîte b dans un entier . Par conséquent, il est ambigu de savoir quelle signature de méthode doit être appelée. Pour résoudre ce problème, vous pouvez utiliser l'une des méthodes suivantes:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

Oui, boxer signifie prendre un type de valeur et l’envelopper dans un type de référence. Depuis que java a introduit l'autoboxing, vous pouvez faire:

void foo(Object bar) {}
//...
    foo(1);

Et java transformera automatiquement l'int 1 en un entier. Dans les versions précédentes, vous auriez à faire:

foo(new Integer(1));

La sélection automatique est plus utile en Java lorsque vous travaillez avec des génériques, car vous ne pouvez pas utiliser de primitives avec des génériques. Par conséquent, pour stocker les entrées dans une liste, vous devez créer une Liste < Integer > . et mettez les ints dans la liste.

Un type encadré signifie que les valeurs sont allouées dans un bloc sur le tas et référencées via un pointeur. C’est bon pour l’uniformité dans l’implémentation du runtime (cela facilite l’avoir des fonctions génériques, etc.), au prix d’une indirection supplémentaire.

Généralement, lorsque vous travaillez avec des collections, vous utilisez des tableaux d'objets. Dans des langages tels que Java, il existe une différence entre un primitif et un objet. Quand une primitive est "boxée", il s’agit essentiellement d’un simple wrapper autour d’une primitive, de sorte qu’elle joue bien avec le reste du cadre qui attend un objet.

La substitution automatique consiste simplement à insérer une primitive dans un objet ou à extraire une primitive de manière transparente afin que vous n'ayez pas à vous soucier de l'étape supplémentaire consistant à le faire vous-même.

Boxed signifie qu'ils ont pris un type de valeur régulière et créé un objet autour de celui-ci. Un peu comme le mettre dans une boîte. Cela doit généralement être évité à cause de la surcharge de la construction de l'objet.

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