2009-08-14 14 views
39

Często mam klasy takich jak:Czy należy ustawić początkowe wartości ciągu java z null na ""?

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

// etc etc etc 
} 

To sprawia, że ​​początkowe wartości pole1 i pole2 równe null. Czy byłoby lepiej mieć wszystkie moje pola klasy String w następujący sposób?

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

// etc etc etc 
} 

Następnie, jeśli jestem zgodny z definicją klasy bym uniknąć wielu problemów wskaźnik NULL. Jakie są problemy z tym podejściem?

+2

Więc nic złego się nie stanie, po prostu stracę status czystości Javy? – Martlark

+0

Błąd można znaleźć, gdy nieoczekiwany ciąg "" jest używany równie użytecznie jak podniesiony wyjątek. Z tą przewagą aplikacja internetowa nie zawiesza się i nie zawstydza. – Martlark

Odpowiedz

6

Nie zgadzam się z innymi plakatami. Używanie pustego ciągu jest dopuszczalne. Wolę go używać, gdy tylko jest to możliwe.

W zdecydowanej większości przypadków, łańcuch pusty i pusty ciąg reprezentuje dokładnie to samo - brak danych. To, czy reprezentujesz to z pustym łańcuchem, czy pustym, jest kwestią wyboru.

+0

Czy możesz zaktualizować, jeśli mamy zmienną referencyjną inną niż String like List. Należy je zainicjować za pomocą jakiegoś obiektu listy, aby zapobiec NPE – Killer

+0

@Shubham, dobry punkt. Kolekcja (lista, zestaw, mapa) to drugi przypadek, w którym używanie "pustej" wersji zamiast wartości zerowej ma często sens. Osobiście wolę (na przykład) pustą listę od referencji zerowej. –

48

Absolutnie nie. Pusty ciąg znaków i ciąg pusty to zupełnie inne rzeczy i nie należy ich mylić.

Aby wyjaśnić dalej:

  • „null” oznacza „Nie zainicjowany tej zmiennej, albo nie ma wartości”
  • „pusty ciąg” oznacza „wiem, co jest wartością, to jest puste".

Jak już wspomniałem Yuliy, jeśli widzisz wiele wyjątków wskaźnika pustego, to dlatego, że oczekujesz, że rzeczy mają wartości, gdy ich nie ma, lub jesteś zaniedbany podczas inicjowania rzeczy przed użyciem im. W obu przypadkach należy poświęcić trochę czasu na prawidłowe programowanie - upewnij się, że rzeczy, które powinny mieć wartości, mają te wartości i upewnij się, że jeśli uzyskujesz dostęp do wartości rzeczy, które mogą nie mieć wartości, weź to pod uwagę.

+0

Zgadzam się; jednak (aby być zwolennikiem diabła) są ludzie, którzy są przyzwyczajeni do luźno napisanych systemów, gdzie mogą po prostu zacząć używać nieokreślonej zmiennej łańcuchowej i traktować ją jako pustą. –

+0

Uzgodniono, ale są powody, dla których warto zainicjować łańcuchy. Warto objaśnić plakatowi różnicę w dwóch. – doomspork

+4

@Chris: Ale Java nie jest językiem o luźnym typie, więc po co zawracać sobie głowę próbą, aby wyglądała jak jedna? – Tundey

1

Unikałbym tego, musisz wiedzieć, czy twoje wystąpienia nie są prawidłowo wypełniane danymi.

66

W ten sposób leży szaleństwo (zwykle). Jeśli masz dużo problemów z pustymi wskaźnikami, to dlatego, że próbujesz ich użyć, zanim zapełnisz je. Te problemy z pustymi wskaźnikami są głośnymi, nieznośnymi syrenami ostrzegawczymi, informującymi o tym, gdzie to jest, pozwalając ci wtedy wejść i naprawić problem. Jeśli po prostu początkowo ustawisz je jako puste, będziesz ryzykował używanie ich zamiast tego, czego faktycznie oczekiwałeś.

+5

+1, ale jedno zastrzeżenie: jeśli wypełniasz obiekty z bazy danych, a bazą danych jest Oracle, pusty łańcuch traktowany jest jako wartość pusta. Jednak jawne inicjowanie na "" nie pomoże ci w tym przypadku. – kdgregory

6

Ogólnie najlepiej byłoby tego uniknąć. Kilka powodów:

  1. Pierwsze NullPointerException jest ogólnie dobry ostrzeżenie, że używasz zmiennej przed powinieneś być, albo że zapomniałeś go ustawić. Ustawienie go na pusty ciąg pozbędzie się wyjątku NullPointerException, ale prawdopodobnie spowoduje inny (i trudniejszy do znalezienia) błąd w dalszej linii programu.

  2. Istnieje ważna różnica między wartością zerową i "". Wartość pusta zwykle oznacza, że ​​nie ustawiono żadnej wartości lub nieznana wartość. Pusty ciąg znaków wskazuje, że został celowo ustawiony jako pusty. W zależności od programu ta subtelna różnica może być ważna.

7

Czy to rzeczywiście sens w określonym przypadku wartości należy stosować przed jest ustawiona gdzieś indziej, i zachowywać się jak pusty ciąg w tym przypadku? tzn. pusty łańcuch jest właściwie poprawną wartością domyślną i czy ma sens mieć wartość domyślną?

Jeśli odpowiedź brzmi "tak", ustawienie jej w deklaracji jest właściwe. Jeśli nie, to przepis na tworzenie błędów trudniej znaleźć i zdiagnozować.

0

Nie ma mowy. Dlaczego chcesz to zrobić? To da nieprawidłowe wyniki. wartości null i "" "nie są takie same

0

Wartość Null jest lepsza, dlatego są one wywoływane jako niezaznaczone wyjątki {Null outinter exception} .Odrzucenie wyjątku informuje, że musisz go zainicjować na wartość inną niż null . wartość przed wywołaniem żadnych metod na nim

Jeśli nie

private String field1 = „”;

Starasz się wyciszyć błąd trudno jest znaleźć błąd, później

..
2

Proponuję nie.

Zamiast tego należy podać polach wartości sensowne. Jeśli nie będą musieli się zmieniać, zrobię je ostateczne.

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

Nie trzeba przypisać, nie zainicjowano jeszcze wartości. Po prostu podaj jej początkowe wartości.

2

wiem, że to jest stare pytanie, ale chciałem zwrócić uwagę na następujące kwestie:

String s = null; 

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

natomiast

String s = ""; 

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

oczywiście naprawdę odpowiedzieć na to, że należy używać StringBuffer zamiast po prostu łączenie ciągów znaków, ale jak wszyscy wiemy, w przypadku niektórych kodów po prostu łatwiej jest się łączyć.

+5

Jaka jest różnica? Wyglądają tak samo dla mnie. – Martlark

1

Myślę, że jeśli użyjesz String s = null, utworzysz zmienną "s" tylko na stosie i żaden obiekt nie będzie istnieć na stercie, ale jak tylko zadeklarujesz rzeczy jak String s = ""; to, co zrobi, jest takie, jakby tworzyło obiekt "" na stercie. Jak wiemy, ciągi są niezmienne, więc za każdym razem, gdy dodasz nową wartość do łańcucha, za każdym razem stworzy nowy obiekt na stercie ... Myślę więc, że String s = null jest wydajniejszy niż String s = "";

Sugestie są mile widziane !!!!!

+0

Nie, ponieważ String jest niezmienny, Java jest wystarczająco inteligentna, aby utworzyć obiekt "" tylko raz i po prostu zwrócić inne odwołanie do niego – jasg

Powiązane problemy