web-dev-qa-db-fra.com

Dois-je définir les valeurs initiales Java String de null à ""?

J'ai souvent une classe en tant que telle:

public class Foo
{
private String field1;
private String field2;

// etc etc etc
}

Cela rend les valeurs initiales de field1 et field2 égales à null. Serait-il préférable d'avoir tous mes champs de classe String comme suit?

public class Foo
{
private String field1 = "";
private String field2 = "";

// etc etc etc
}

Ensuite, si je suis cohérent avec la définition de classe, j'éviterais beaucoup de problèmes de pointeur nul. Quels sont les problèmes avec cette approche?

44
Martlark

Je ne suis pas d'accord avec les autres affiches. L'utilisation de la chaîne vide est acceptable. Je préfère l'utiliser autant que possible.

Dans la grande majorité des cas, une chaîne nulle et une chaîne vide représentent exactement la même chose - des données inconnues. Que vous représentiez cela avec une chaîne vide ou vide est une question de choix.

7
John O

De cette façon réside la folie (généralement). Si vous rencontrez de nombreux problèmes de pointeurs nuls, c'est parce que vous essayez de les utiliser avant de les remplir. Ces problèmes de pointeur nul sont de fortes sirènes d'avertissement désagréables vous indiquant où se trouve cette utilisation, vous permettant ensuite de résoudre le problème. Si vous les avez initialement définis comme vides, vous risquez de les utiliser au lieu de ce que vous attendiez réellement.

71
Yuliy

Absolument pas. Une chaîne vide et une chaîne nulle sont des choses entièrement différentes et vous ne devez pas les confondre.

Pour expliquer davantage:

  • "null" signifie "Je n'ai pas initialisé cette variable, ou elle n'a pas de valeur"
  • "chaîne vide" signifie "Je sais quelle est la valeur, elle est vide".

Comme Yuliy l'a déjà mentionné, si vous voyez beaucoup d'exceptions de pointeur nul, c'est parce que vous vous attendez à ce que les choses aient des valeurs quand elles ne le font pas, ou vous êtes bâclé au sujet de l'initialisation des choses avant de les utiliser. Dans les deux cas, vous devez prendre le temps de programmer correctement - assurez-vous que les choses qui devraient avoir des valeurs ont ces valeurs, et assurez-vous que si vous accédez aux valeurs de choses qui pourraient ne pas avoir de valeur, vous en tenez compte.

50
Paul Tomblin

Est-il réellement judicieux dans un cas spécifique que la valeur soit utilisée avant qu'elle ne soit définie ailleurs et qu'elle se comporte comme une chaîne vide dans ce cas? c'est-à-dire qu'une chaîne vide est en fait une valeur par défaut correcte, et est-il sensé d'avoir une valeur par défaut?

Si la réponse est oui, le définir sur "" dans la déclaration est la bonne chose à faire. Sinon, c'est une recette pour rendre les bogues plus difficiles à trouver et à diagnostiquer.

9
Michael Borgwardt

En général, il vaut mieux éviter cela. Quelques raisons:

  1. L'obtention d'une NullPointerException est généralement un bon avertissement que vous utilisez une variable avant de le faire, ou que vous avez oublié de la définir. Le définir sur une chaîne vide se débarrasserait de l'exception NullPointerException, mais provoquerait probablement un bogue différent (et plus difficile à localiser) plus bas dans la ligne de votre programme.

  2. Il peut y avoir une différence valide entre null et "". Une valeur nulle indique généralement qu'aucune valeur n'a été définie ou que la valeur est inconnue. Une chaîne vide indique qu'elle a été délibérément définie pour être vide. Selon votre programme, cette subtile différence pourrait être importante.

7
Eric Petroelje

Je sais que c'est une vieille question mais je voulais souligner ce qui suit:

  String s = null;

  s += "hello";
  System.out.println(s);// this will return nullhello

tandis que

  String s = "";

  s += "hello";
  System.out.println(s); // this will return hello

évidemment, la vraie réponse à cela est qu'il faut utiliser StringBuffer plutôt que de simplement concaténer des chaînes mais comme nous savons tous que pour certains codes, il est simplement plus simple de concaténer.

3
Nilesh Tailor

Je ne proposerais ni l'un ni l'autre.

Au lieu de cela, vous devez donner à vos champs des valeurs sensibles. S'ils ne doivent pas changer, je les rendrais définitifs.

public class Foo { 
    private final String field1; 
    private final String field2;
    public Foo(String field1, String field2) {
       this.field1 = field1;
       this.field2 = field2;
    }
    // etc. 
} 

Pas besoin d'attribuer, je ne suis pas encore initialisé. Donnez-lui simplement les valeurs initiales.

3
Peter Lawrey

J'éviterais de le faire, vous devez savoir si vos instances ne sont pas correctement remplies de données.

1
NSherwin

En aucune façon. Pourquoi est ce que tu veux faire ça? Cela donnera des résultats incorrects. les valeurs nulles et "" "ne sont pas identiques.

1
vsingh

Je pense que lorsque vous utilisez String s = null, cela créera la variable "s" sur la pile uniquement et aucun objet n'existera sur le tas, mais dès que vous déclarerez des choses comme String s = ""; ce qu'il fera, c'est comme il créera "" un objet sur le tas. Comme nous savons que les chaînes sont immuables, donc chaque fois que vous assignerez une nouvelle valeur à une chaîne variable à chaque fois, cela créera un nouvel objet sur le tas ... Donc je pense que String s = null est efficace que String s = "";

Les suggestions sont les bienvenues !!!!!

1
kunal

Null est meilleur, c'est pourquoi elles sont appelées exceptions non vérifiées {exception de pointeur nul}. Lorsque l'exception est levée, elle vous indique que vous devez l'initialiser à une valeur non nulle avant d'appeler des méthodes dessus.

Si tu fais

champ String privé1 = "";

Vous essayez de supprimer l'erreur. Il est difficile de trouver le bogue plus tard.

0
vinaynag