Ssortingng.valueOf () vs. Object.toSsortingng ()

En Java, existe-t-il une différence entre Ssortingng.valueOf(Object) et Object.toSsortingng() ? Existe-t-il une convention de code spécifique pour ces derniers?

Selon la documentation Java , Ssortingng.valueOf() renvoie:

si l’argument est null , alors une chaîne égale à "null" ; sinon, la valeur de obj.toSsortingng() est renvoyée.

Donc, il ne devrait pas y avoir de différence, sauf pour une invocation de méthode supplémentaire.

De plus, dans le cas de Object#toSsortingng , si l’instance est null , une NullPointerException sera lancée, ce qui est sans doute moins sûr .

 public static void main(Ssortingng args[]) { Ssortingng str = null; System.out.println(Ssortingng.valueOf(str)); // This will print a Ssortingng equal to "null" System.out.println(str.toSsortingng()); // This will throw a NullPointerException } 

Les différences entre Ssortingng.valueOf (Object) et Object.toSsortingng () sont les suivantes:

1) Si ssortingng est null,

Ssortingng.valueOf(Object ) affichera null alors Object.toSsortingng() lancera une exception de pointeur nul.

 public static void main(Ssortingng args[]){ Ssortingng str = null; System.out.println(Ssortingng.valueOf(str)); // it will prints null System.out.println(str.toSsortingng()); // it will throw NullPointer Exception } 

2) Signature:

La méthode valueOf () de la classe Ssortingng est statique. alors que la méthode toSsortingng () de la classe Ssortingng est non statique.

La signature ou la syntaxe de la méthode valueOf () de la chaîne est donnée ci-dessous:

 public **static** Ssortingng valueOf(boolean b) public **static** Ssortingng valueOf(char c) public **static** Ssortingng valueOf(char[] c) public **static** Ssortingng valueOf(int i) public **static** Ssortingng valueOf(long l) public **static** Ssortingng valueOf(float f) public **static** Ssortingng valueOf(double d) public **static** Ssortingng valueOf(Object o) 

La signature ou la syntaxe de la toSsortingng() de la chaîne est donnée ci-dessous:

 public Ssortingng toSsortingng() 

En Java, existe-t-il une différence entre Ssortingng.valueOf (Object) et Object.toSsortingng ()?

Oui.

Comme l’explique javadoc , Ssortingng.valueOf(null) sera traité comme un cas spécial, alors que null.toSsortingng() fournira simplement un NPE.

Existe-t-il une convention de code spécifique pour ces derniers?

Non.

Utilisation la plus appropriée aux exigences du contexte dans lequel vous l’utilisez. (Avez-vous besoin que le formatage fonctionne pour null ?)

Note: ce n’est pas une convention de code. C’est juste de la programmation de bon sens. Il est plus important que votre code soit correct que de suivre une convention stylistique ou un dogme de «meilleure pratique».


Opinion personnelle:

Certains développeurs acquièrent la mauvaise habitude (IMO) de “défendre” contre les nuls. Donc, vous voyez beaucoup de tests pour les valeurs NULL et pour traiter les valeurs NULL comme des cas spéciaux. L’idée semble être d’empêcher les NPE de se produire.

Je pense que c’est une mauvaise idée. En particulier, je pense que c’est une mauvaise idée si ce que vous faites lorsque vous trouvez un null est d’essayer de “faire du bien” … sans tenir compte de la raison pour laquelle il ya eu une null .

En général, il vaut mieux éviter que le null soit présent en premier lieu… à moins qu’il ait un sens très spécifique dans la conception de votre application ou de votre API. Ainsi, plutôt que d’éviter le NPE avec beaucoup de codage défensif, il est préférable de laisser le NPE se produire, puis de rechercher et de corriger la source du null inattendu qui a déclenché le NPE.

Alors, comment cela s’applique-t-il ici?

Eh bien, si vous y réfléchissez, utiliser Ssortingng.valueOf(obj) pourrait être un moyen de “faire du bien”. Cela doit être évité. S’il est inattendu que obj soit null dans le contexte, il est préférable d’utiliser obj.toSsortingng() .

Ssortingng.valueOf(Object) et Object.toSsortingng() sont littéralement la même chose.

Si vous examinez l’implémentation de Ssortingng.valueOf (Object) , vous verrez que Ssortingng.valueOf(Object) est simplement une invocation null-safe de toSsortingng() de l’object approprié:

 Returns the ssortingng representation of the Object argument. Parameters: obj an Object. Returns: if the argument is null, then a ssortingng equal to "null"; otherwise, the value of obj.toSsortingng() is returned. See also: Object.toSsortingng() public static Ssortingng valueOf(Object obj) { return (obj == null) ? "null" : obj.toSsortingng(); } 

La différence la plus importante réside dans la manière dont ils gèrent les références de chaînes NULL.

 Ssortingng str = null; System.out.println("Ssortingng.valueOf gives : " + Ssortingng.valueOf(str));//Prints null System.out.println("Ssortingng.toSsortingng gives : " + str.toSsortingng());//This would throw a NullPointerExeption 

Lorsque l’argument est null , Ssortingng.valueOf renvoie "null" , mais Object.toSsortingng lève une Object.toSsortingng NullPointerException , c’est la seule différence.

Il y a une autre différence majeure entre les deux méthodes lorsque l’object que nous convertissons est un tableau.

Lorsque vous convertissez un tableau en utilisant Object.toSsortingng (), vous obtiendrez une sorte de valeur de mémoire (@ suivi du code de hachage du tableau).

Pour obtenir un toSsortingng () lisible par l’homme, vous devez utiliser Ssortingng.valueOf (char []); Notez que cette méthode ne fonctionne que pour les tableaux de type char. Je recommande d’utiliser Arrays.toSsortingng (Object []) pour convertir des tableaux en Ssortingng.

La deuxième différence est lorsque l’object est nul, ValueOf () renvoie une chaîne “null”, tandis que toSsortingng () renvoie une exception de pointeur nul.

Le tableau ci-dessous montre l’implémentation de java.lang.Ssortingng.valueOf comme décrit dans la source de jdk8u25. Donc, selon mon commentaire, il n’y a pas de différence. Il appelle “Object.toSsortingng”. Pour les types primitifs, il l’enveloppe dans sa forme d’object et appelle “toSsortingng” dessus.

Voir ci-dessous:

 /* * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ public static Ssortingng valueOf(Object obj) { return (obj == null) ? "null" : obj.toSsortingng(); } public static Ssortingng valueOf(char data[]) { return new Ssortingng(data); } public static Ssortingng valueOf(char data[], int offset, int count) { return new Ssortingng(data, offset, count); } public static Ssortingng copyValueOf(char data[], int offset, int count) { return new Ssortingng(data, offset, count); } public static Ssortingng copyValueOf(char data[]) { return new Ssortingng(data); } public static Ssortingng valueOf(boolean b) { return b ? "true" : "false"; } public static Ssortingng valueOf(char c) { char data[] = {c}; return new Ssortingng(data, true); } public static Ssortingng valueOf(int i) { return Integer.toSsortingng(i); } public static Ssortingng valueOf(long l) { return Long.toSsortingng(l); } public static Ssortingng valueOf(float f) { return Float.toSsortingng(f); } public static Ssortingng valueOf(double d) { return Double.toSsortingng(d); } 

Je ne peux pas dire exactement quelle est la différence, mais il semble y avoir une différence dans le fonctionnement au niveau des octets. Dans le scénario de chiffrement suivant, Object.toSsortingng () produisait une valeur qui ne pouvait pas être déchiffrée, alors que Ssortingng.valueOf () fonctionnait comme prévu …

 private static char[] base64Encode(byte[] bytes) { return Base64.encode(bytes); } private static Ssortingng encrypt(Ssortingng encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); //THIS FAILED when attempting to decrypt the password //return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toSsortingng(); //THIS WORKED return Ssortingng.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8")))); }//end of encrypt()