Měl jsem nastavit výchozí hodnoty java řetězec z null „“?

hlasů
40

Často mám třídu jako takovou:

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

// etc etc etc
}

To znamená, že počáteční hodnoty pole1 a pole2 rovná null. Že by bylo lepší mít všechny své String třídy pole následujícím způsobem?

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

// etc etc etc
}

Pak, když jsem v souladu s definicí třídy bych vyhnout spoustu null problémů ukazatele. Jaké jsou problémy s tímto přístupem?

Položena 14/08/2009 v 14:51
zdroj uživatelem
V jiných jazycích...                            


11 odpovědí

hlasů
68

Tak leží šílenství (obvykle). Pokud vedete do hodně nulových problémů ukazatel, to proto, že se snažíte, aby jejich použití, než ve skutečnosti jejich nenaplnění. Tyto problémy null ukazatel jsou hlasité nepříjemný varovné sirény vyprávějí vám, kde toto užívání, což vám umožní pak jít a problém vyřešit. Pokud jste právě na začátku nastavit na prázdný, pak budete riskovat jejich použití namísto toho, co bylo ve skutečnosti tam očekával.

Odpovězeno 14/08/2009 v 14:55
zdroj uživatelem

hlasů
49

Rozhodně ne. Prázdný řetězec a řetězec null, jsou zcela odlišné věci a vy byste je nezaměňovat.

Pro další vysvětlení:

  • „Null“ znamená „Já jsem se inicializuje tuto proměnnou, nebo to nemá žádnou hodnotu“
  • „Prázdný řetězec“ znamená „Já vím, co je hodnota, je to prázdné“.

Jako Yuliy již bylo zmíněno, pokud jste viděli spoustu ukazatel NULL výjimek, je to proto, že jste očekával věci mají hodnoty, pokud tomu tak není, nebo jste byl nedbalý o inicializaci věci před jejich použitím. V každém případě byste měli mít čas na správné programování - Ujistěte se, věci, které by měly mít hodnoty mají tyto hodnoty, a ujistěte se, že pokud máte přístup k hodnoty věci, které nemusí mít hodnotu, která si vzít v úvahu.

Odpovězeno 14/08/2009 v 14:53
zdroj uživatelem

hlasů
8

To vlastně dává smysl v konkrétním případě pro hodnoty, které mají být použity před tím, než je nastaven někde jinde, a chovat se jako prázdný řetězec v tomto případě? tj je prázdný řetězec vlastně správná výchozí hodnota, a nemá smysl mít výchozí hodnotu vůbec?

Pokud je odpověď ano, nastavení na „“ v prohlášení je správná věc. Pokud tomu tak není, je to recept na výrobu Chyby těžší najít a diagnostikovat.

Odpovězeno 14/08/2009 v 15:03
zdroj uživatelem

hlasů
7

Nesouhlasím s jinými plakáty. Pomocí prázdný řetězec je přijatelné. Raději ji použít, kdykoli je to možné.

Ve velké většině případů null String a prázdný String představují přesně to samé - neznámé data. Ať už si představují, že s null nebo prázdný řetězec, je otázkou volby.

Odpovězeno 16/08/2009 v 00:26
zdroj uživatelem

hlasů
7

Obecně platí, že by bylo nejlepší, aby se tomu zabránilo. Pár důvodů:

  1. Získání NullPointerException je obecně dobrá varování, že používáte proměnnou dříve, než by měla být, nebo že jste zapomněli ji nastavit. Nastavením na prázdný řetězec se zbavit NullPointerException, ale pravděpodobně způsobí jiný (a těžší vystopovat) chyba dále po proudu ve vašem programu.

  2. Tam může být platný rozdíl mezi null a „“. Hodnota null obvykle znamená, že byla stanovena žádná hodnota nebo hodnota není známa. Prázdný řetězec znamená, že to bylo úmyslně být prázdný. V závislosti na programu, že malý rozdíl může být důležité.

Odpovězeno 14/08/2009 v 15:02
zdroj uživatelem

hlasů
2

Vím, že to je stará otázka, ale já chtěl poukázat na následující:

  String s = null;

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

zatímco

  String s = "";

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

zřejmě opravdu odpověď na to je, že člověk by měl používat StringBuffer spíše než jen zřetězit řetězce, ale jak všichni víme, že z nějakého kódu, je prostě jednodušší zřetězit.

Odpovězeno 27/04/2011 v 19:23
zdroj uživatelem

hlasů
2

Navrhoval bych taky ne.

Místo toho byste měli dát vaše pole rozumné hodnoty. Pokud tomu tak není nutné měnit, chtěl bych, aby byly v konečném znění.

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

Není třeba přiřadit, já ne inicializovat dosud hodnoty. Jen to počáteční hodnoty.

Odpovězeno 23/07/2010 v 19:02
zdroj uživatelem

hlasů
1

Myslím, že pokud používáte String s = null bude vytvářet proměnné „S“ na jediné fronty a žádný objekt existuje na hromadu, ale jakmile deklarujete věci tak jako String s = „“; co to bude dělá, je, jak to bude vytvářet „“ objekt na heap.As víme, že Řetězce jsou neměnitelné, takže vždy, když u wil přiřadit novou hodnotu řetězce proměnná pokaždé to vytvoří nový objekt na haldě ... Takže si myslím, String s = null je účinnější než řetězci s = „“;

Návrhy jsou vítány !!!!!

Odpovězeno 03/08/2011 v 14:38
zdroj uživatelem

hlasů
1

Já bych vyhýbat se dělat to, co potřebujete vědět, zda vaše instance nejsou stále naplněn daty správně.

Odpovězeno 14/08/2009 v 14:54
zdroj uživatelem

hlasů
0

Null je lepší, to je důvod, proč se jim říká nekontrolované výjimky {nulový ukazatel výjimku}. Když je vyvolána výjimka, to vám řekne, že máte k inicializaci nějaké non hodnotu null před voláním jakékoliv metody na něj.

Pokud udelas

private String field1 = "";

Snažíte se potlačit chybu. Je těžké najít chybu, později.

Odpovězeno 14/08/2009 v 18:02
zdroj uživatelem

hlasů
0

V žádném případě. Proč chcete dělat, že? Že bude dávat nesprávné výsledky. nuly „“ a“nejsou stejné.

Odpovězeno 14/08/2009 v 15:13
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more