Přejděte na >> nový blog <<
Z důvodů těžké spravovatelnosti tento blog zavírám a bude sloužit již jen jako archiv článků.
Weblog   Foto galerie   Odkazy   Implementace katedrálního portálu   ZČU-FAV

Javablog: optimalizované použití stejných řetězců v rámci aplikace

Javablog: optimalizované použití stejných řetězců v rámci aplikace

2005-12-31 11:05 | 945 x   Programování

Celkem dlouho jsme se v práci přeli nad zajímavým problémem. Pokud chci vrátit prázdný string - řetězec z nějaké metody, jaký přístup je lepší. Nakonec k tomu připadl i dovětek: v rámci celé aplikace.

Já preferoval přístup:

    return new String();

na rozdíl od kolegy, který vždy vrací:

    return "";

Na první pohled stejný to vypadá stejně. V prvním případě se vytvoří nový objekt String a ten se odešle jako návratová hodnota z metody. Druhý případ funguje obdobně, jelikož metoda vrací instanci třídy String, ta musí vzniknout z prázného řetězce "". To znamená tak jako tak vytvořit jednu novou instanci třídy String.

Nejlepší způsob vracení prázdného String

Nakonec jsme zjistili, že je lepší preferovat druhý jmenovaný přístup, tedy return "";. Proč? Na stránce Java Language Specification ja část věnovaná tomuto problému: tady.

Výsek kódu příkladu

1  public static void main(String[] args) {     
2    String hello = "Hello", lo = "lo";
3    System.out.print((hello == "Hello") + " "); 
4    System.out.print((Other.hello == hello) +  " "); 
5    System.out.print((other.Other.hello == hello) + " "); 
6    System.out.print((hello == ("Hel"+"lo")) + " "); 
7    System.out.print((hello == ("Hel"+lo)) +  " "); 
8    System.out.println(hello == ("Hel"+ lo).intern()); 
9  }

Přičemž existuje již třída:

1  package other;
2  public class Other { static String hello = "Hello"; } 

Výsledek - co bude na obrazovce?

true true true true false true

Jak je to možné?

Jelikož práce VM s řetězci je velice optimalizovaná, průběžně si je ukládá a následně používá ty, které byli již jednou vytvořeny. Ostatně z tohoto příkladuje to jasně vidět. Funguje to evidentně i mezi třídami, balíky atd. Pokud použijete tento přístup, bude se v celé aplikaci vracet stejná instance bez vytváření dalších jiných.

Syntaxe byla zvýrazněna pomocí Code2HTML.

Jméno
Email
http://
Zpráva
  Příkazy Textile