Comment convertir de int en Ssortingng?

Je travaille sur un projet où toutes les conversions de int en Ssortingng sont effectuées comme ceci:

 int i = 5; Ssortingng strI = "" + i; 

Je ne suis pas familier avec Java. Est-ce que cette pratique habituelle ou quelque chose ne va pas, comme je suppose?

Les manières normales seraient Integer.toSsortingng(i) ou Ssortingng.valueOf(i) .

La concaténation fonctionnera, mais elle n’est pas conventionnelle et pourrait être une mauvaise odeur, car elle suggère que l’auteur ne connaît pas les deux méthodes ci-dessus (que pourrait-il savoir d’autre?).

Java a un support spécial pour l’opérateur + lorsqu’il est utilisé avec des chaînes (voir la documentation ) qui traduit le code que vous avez publié dans:

 SsortingngBuilder sb = new SsortingngBuilder(); sb.append(""); sb.append(i); Ssortingng strI = sb.toSsortingng(); 

à la compilation. C’est légèrement moins efficace ( sb.append() finit par appeler Integer.getChars() , ce que Integer.toSsortingng() aurait fait de toute façon), mais cela fonctionne.

Pour répondre au commentaire de Grodriguez: ** Non, le compilateur n’optimise pas la chaîne vide dans ce cas – regardez:

 simon@lucifer:~$ cat TestClass.java public class TestClass { public static void main(Ssortingng[] args) { int i = 5; Ssortingng strI = "" + i; } } simon@lucifer:~$ javac TestClass.java && javap -c TestClass Comstackd from "TestClass.java" public class TestClass extends java.lang.Object{ public TestClass(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.Ssortingng[]); Code: 0: iconst_5 1: istore_1 

Initialiser le SsortingngBuilder:

  2: new #2; //class java/lang/SsortingngBuilder 5: dup 6: invokespecial #3; //Method java/lang/SsortingngBuilder."":()V 

Ajoutez la chaîne vide:

  9: ldc #4; //Ssortingng 11: invokevirtual #5; //Method java/lang/SsortingngBuilder.append: (Ljava/lang/Ssortingng;)Ljava/lang/SsortingngBuilder; 

Ajoutez le nombre entier:

  14: iload_1 15: invokevirtual #6; //Method java/lang/SsortingngBuilder.append: (I)Ljava/lang/SsortingngBuilder; 

Extraire la dernière chaîne:

  18: invokevirtual #7; //Method java/lang/SsortingngBuilder.toSsortingng: ()Ljava/lang/Ssortingng; 21: astore_2 22: return } 

Il y a une proposition et un travail en cours pour changer ce comportement, ciblé pour JDK 9.

C’est acceptable, mais je n’ai jamais écrit quelque chose comme ça. Je préférerais ceci:

 Ssortingng strI = Integer.toSsortingng(i); 

Ce n’est pas un bon moyen.

Lorsque vous effectuez une conversion de int en chaîne, cela devrait être utilisé:

 int i = 5; Ssortingng strI = Ssortingng.valueOf(i); 

Ce n’est pas seulement l’optimisation 1 . Je n’aime pas

 "" + i 

parce que cela n’exprime pas ce que je veux vraiment faire 2 .

Je ne veux pas append un entier à une chaîne (vide). Je veux convertir un entier en chaîne:

 Integer.toSsortingng(i) 

Ou, pas mon préféré, mais toujours mieux que la concaténation, obtenir une représentation sous forme de chaîne d’un object (entier):

 Ssortingng.valueOf(i) 

1. Pour le code qui est appelé très souvent, comme dans les boucles, l’optimisation est également un point pour ne pas utiliser la concaténation .

2. ceci n’est pas valable pour l’utilisation de la concaténation réelle comme dans System.out.println("Index: " + i); ou Ssortingng id = "ID" + i;

Beaucoup de cours d’introduction à l’université semblent enseigner ce style, pour deux raisons (selon mon expérience):

  • Il ne nécessite pas la compréhension des classes ou des méthodes. Habituellement, ceci est enseigné bien avant que le mot «classe» soit mentionné – ni même les appels de méthode. Donc, utiliser quelque chose comme Ssortingng.valueOf(…) dérouterait les élèves.

  • C’est une illustration de la «surcharge d’opérateur» – en fait, cela nous a été vendu en tant qu’opérateur surchargé idiomatique (petite merveille ici, car Java n’autorise pas la surcharge personnalisée des opérateurs).

Donc, il peut être né d’une nécessité didactique (bien que je soutienne que c’est juste un mauvais enseignement) ou être utilisé pour illustrer un principe qui est par ailleurs assez difficile à démontrer en Java.

L’expression

 "" + i 

conduit à la conversion de chaîne de i à l’exécution. Le type global de l’expression est Ssortingng . i abord converti en object Integer ( new Integer(i) ), puis Ssortingng.valueOf(Object obj) est appelé. Donc c’est équivalent à

 "" + Ssortingng.valueOf(new Integer(i)); 

Evidemment, c’est un peu moins performant que d’appeler simplement Ssortingng.valueOf(new Integer(i)) qui produira le même résultat.

L’avantage de ""+i est que la frappe est plus facile / plus rapide et que certaines personnes pensent que c’est plus facile à lire. Ce n’est pas une odeur de code car cela n’indique pas de problème plus profond.

(Référence: JLS 15.8.1 )

Personnellement, je ne vois rien de mal dans ce code.

C’est assez utile quand vous voulez enregistrer une valeur int et que le logger accepte simplement une chaîne. Je dirais qu’une telle conversion est pratique lorsque vous devez appeler une méthode acceptant une chaîne, mais que vous avez une valeur int.

Quant au choix entre Integer.toSsortingng ou Ssortingng.valueOf , tout est une question de goût.
… Et en interne, Ssortingng.valueOf appelle la méthode Integer.toSsortingng par la voie. 🙂

L’autre façon dont je suis conscient est de la classe Integer :

 Integer.toSsortingng(int n); Integer.toSsortingng(int n, int radix); 

Un exemple concret (même si je ne pense pas en avoir besoin):

 Ssortingng five = Integer.toSsortingng(5); // returns "5" 

Il fonctionne également pour d’autres types primitifs, par exemple Double.toSsortingng .

Voir ici pour plus de détails.

Cette technique a été enseignée dans une classe d’introduction à Java de premier cycle que j’ai prise il y a plus de dix ans. Cependant, je devrais noter que, IIRC, nous n’avions pas encore abordé les méthodes de classe Ssortingng et Integer.

La technique est simple et rapide à taper. Si tout ce que je fais est d’imprimer quelque chose, je l’utiliserai (par exemple, System.out.println("" + i); mais je pense que ce n’est pas le meilleur moyen de faire une conversion, car cela prend en second lieu, pour comprendre ce qui se passe quand il est utilisé de cette manière, et si la performance est une préoccupation, elle semble plus lente (plus en bas, ainsi que dans d’autres réponses).

Personnellement, je préfère Integer.toSsortingng (), car il est évident que ce qui se passe. Ssortingng.valueOf () serait mon deuxième choix, car il semble confus (observez les commentaires après la réponse de darioo).

Juste pour les sourires 🙂 J’ai écrit des classes pour tester les trois techniques: “” + i, Integer.toSsortingng et Ssortingng.ValueOf. Chaque test vient de convertir les ints de 1 à 10000 en ssortingngs. J’ai ensuite couru cinq fois à travers la commande Linux. Integer.toSsortingng () était légèrement plus rapide que Ssortingng.valueOf () une fois, ils étaient liés trois fois et Ssortingng.valueOf () était plus rapide une fois; Cependant, la différence n’a jamais été supérieure à quelques millisecondes.

La technique “” + i était plus lente que les deux sur tous les tests sauf un, quand elle était 1 milliseconde plus rapide que Integer.toSsortingng () et 1 milliseconde plus lente que Ssortingng.valueOf () (évidemment sur le même test où Ssortingng.valueOf () était plus rapide que Integer.toSsortingng ()). Alors qu’il était généralement plus lent que quelques millisecondes, il y avait un test où il était environ 50 millisecondes plus lent. YMMV .

Il existe différentes manières de convertir des chaînes:

 SsortingngBuilder ssortingng = ssortingng.append(i).toSsortingng(); Ssortingng ssortingng = Ssortingng.valueOf(i); Ssortingng ssortingng = Integer.toSsortingng(i); 

Cela dépend de la manière dont vous souhaitez utiliser votre chaîne. Cela peut aider:

 Ssortingng total = Integer.toSsortingng(123) + Double.toSsortingng(456.789); 

Il existe de nombreux moyens de convertir un entier en chaîne:

1)

 Integer.toSsortingng(10); 

2)

  Ssortingng hundred = Ssortingng.valueOf(100); // You can pass an int constant int ten = 10; Ssortingng ten = Ssortingng.valueOf(ten) 

3)

 Ssortingng thousand = "" + 1000; // Ssortingng concatenation 

4)

 Ssortingng million = Ssortingng.format("%d", 1000000) 
 Ssortingng strI = Ssortingng.valueOf(i); Ssortingng ssortingng = Integer.toSsortingng(i); 

Les deux manières sont correctes.

Surtout idem sur SimonJ. Je n’aime vraiment pas le “” + i idiome. Si vous dites Ssortingng.valueOf (i), Java convertit le nombre entier en chaîne et renvoie le résultat. Si vous dites “” + i, Java crée un object SsortingngBuilder, lui ajoute une chaîne vide, le convertit en une chaîne, ajoute ceci à SsortingngBuilder, puis convertit SsortingngBuilder en une chaîne. C’est beaucoup d’étapes supplémentaires. Je suppose que si vous le faites une fois dans un grand programme, ce n’est pas grave. Mais si vous faites cela tout le temps, vous faites travailler votre ordinateur sur un tas de choses supplémentaires et créez tous ces objects supplémentaires qui doivent ensuite être nettoyés. Je ne veux pas être fanatique de la micro-optimisation, mais je ne veux pas non plus gaspiller inutilement.

Utiliser “” + i est le moyen le plus court et le plus simple de convertir un nombre en chaîne. Ce n’est pas le plus efficace, mais c’est le plus clair à mon humble avis et c’est généralement plus important. Plus le code est simple, moins vous risquez de commettre une erreur.

Il y a trois façons de convertir des chaînes

  1. Ssortingng ssortingng = “” + i;
  2. Ssortingng ssortingng = Ssortingng.valueOf (i);
  3. Ssortingng ssortingng = Integer.toSsortingng (i);

Personnellement, je pense que “” je regarde comme l’affiche de la question originale dit “malodorante”. J’ai utilisé beaucoup de langages OO en dehors de Java. Si cette syntaxe était destinée à être appropriée, Java interpréterait simplement le i seul sans avoir besoin de “” être converti en chaîne et le faire car le type de destination est non ambigu et une seule valeur serait fournie à droite. . L’autre semble être un “truc” pour tromper le compilateur, mauvais mojo quand différentes versions de Javac faites par d’autres fabricants ou d’autres plates-formes sont sockets en compte si le code doit être porté. prendre un Typecast: (Ssortingng) i.

Compte tenu de ma façon d’apprendre et de faciliter la compréhension d’une telle construction lors de la lecture d’autres codes, je vote pour la méthode Integer.toSsortingng (i). Oubliant un ou deux ns dans la façon dont Java implémente les choses en arrière-plan vs. Ssortingng.valueOf (i) cette méthode me semble juste et dit exactement ce qui se passe: j’ai Integer et je souhaite qu’elle soit convertie en Ssortingng.

Un bon point fait quelques fois est peut-être que l’utilisation de SsortingngBuilder est une bonne réponse à la création de chaînes de caractères mixtes de texte et d’ints ou d’autres objects, car ce qui sera utilisé en arrière-plan de toute façon n’est-ce pas?

Juste mes deux centimes jetés dans la cagnotte déjà bien payée des réponses à la question du Mans … sourires

EDIT TO MY OWW ANSW APRES QUELQUES REFLEXIONS:

Ok, ok, je pensais à cela et Ssortingng.valueOf (i) est également très bon et il dit: je veux une chaîne qui représente la valeur d’un entier. lol, l’anglais est de loin plus difficile à parsingr que Java! Mais, je laisse le rest de ma réponse / commentaire … On m’a toujours appris à utiliser le niveau le plus bas d’une méthode / chaîne de fonctions si possible et à maintenir la lisibilité si Ssortingng.valueOf appelle Integer.toSsortingng alors pourquoi utiliser une orange entière si tu vas juste le peler quand même, Hmmm?

Pour clarifier mon commentaire à propos de SsortingngBuilder, je construis beaucoup de chaînes avec des combinaisons de texte essentiellement littéral et int et elles finissent par être longues et laides avec les appels aux routines mentionnées ci-dessus entre les +, donc Les objects SB de toute façon et la méthode append a des surcharges, il serait peut-être plus simple de continuer et de l’utiliser … Donc je suppose que je suis à 5 cents sur celui-ci, hein? lol …

utilisez Integer.toSsortingng(tmpInt).sortingm();

Essayez le typage simple

 char c = (char) i;