2016-03-23 12 views
12

Czy są jakieś korzyści związane z wydajnością dzięki zastosowaniu private final static String w java vs użyciu lokalnej zmiennej łańcuchowej, która musi zostać "zainicjalizowana" za każdym razem, gdy metoda jest dostępna?Łańcuchy Java: prywatna zmienna statyczna vs zmienna lokalna

ja sądzę, że za pomocą private static final strun jest dobrą praktyką dla stałych, które się do ponownego wykorzystania w różnych częściach klasy, jednak jeśli ciąg miały być wykorzystane tylko w jednej metody, w jednym miejscu, na bardzo konkretnego powodu, że żadna inna metoda nie jest zaniepokojona, ja naprawdę wolę utrzymywać wewnętrzny interfejs klasy w czystości z mniej prywatnymi członkami, i po prostu użyj zmiennej lokalnej.

Zważywszy, że Java ma internowanie łańcuchów i rzeczywiście utrzymuje pulę z jednym egzemplarzu każdego napisu, który pobiera zadeklarowanej za pomocą cytatów (String s = "some string"), to tam rzeczywiście będzie hit wydajność od konieczności zadeklarować/zainicjować/przypisać każdej zmiennej czas dostępu do metody kontra ciąg statyczny?

Aby było bardziej zrozumiałe, czy byłaby jakaś różnica między używaniem SS lub LS?

class c { 
private final static String SS = "myString"; 

    private void method(){ 
    //do something with SS 
    } 

    private void OtherMethod(){ 
    String LS = "myOtherString" 
    //do same thing with LS 
    } 
} 
+1

"* zachowuje pulę z pojedynczą kopią każdego ciągu znaków *" jest to niepoprawne. Jedynymi strunami Java interns (chyba że wywołasz 'String.intern()') są '" cytowane "' stałe w twoim kodzie. Łańcuchy skonstruowane w środowisku wykonawczym * nie * internowane w puli stałych. – dimo414

+0

masz rację, te, do których odnosiłem się, będę edytować –

Odpowiedz

7

Używanie nazwanej stałej może być lepsze dla łatwości konserwacji. Jednak stałe znane w czasie kompilacji mogą być zaznaczone, w takim przypadku nie ma najmniejszej różnicy.

Uwaga: jeśli używasz literału String, zostanie on utworzony tylko raz, bez względu na to, w którym miejscu JVM jest używany.

W tym przypadku jedyną różnicą jest użycie zmiennej lokalnej na stosie, która prawdopodobnie nie będzie droższa od stałej, która została wstawiona.

by tam być rzeczywiście trafień wydajności z konieczności zadeklarować zmienną każdym razem, gdy metoda jest dostępne

Jako Java używa statyczny kompilator, zmienna jest tylko oświadczył raz (lub raz na każdy etap kompilacji), podczas ładowania klasy/metody, niezależnie od tego, ile razy metody są wywoływane. Zmienna może zostać zainicjowana za każdym razem jednak.

2

Prawda jest taka, że ​​na końcu nie ma różnicy. Stały ciąg w zmiennej lokalnej nadal znajdzie się w puli stałej i zostanie zoptymalizowany. Więc ogólnie rzecz biorąc, zmienne lokalne są szybsze, ponieważ są łatwiej dostępne, ale w przypadku ciągłych ciągów nie ma znaczenia. Wybierz więc, co jest bardziej czytelne i intuicyjne w twoim przypadku.

+2

dlaczego masz na myśli, że zmienne lokalne są szybsze niż statyka? –

+0

@Xoce 웃 Пepeúpa Zmienna lokalna może być nieco szybsza niż dostęp do nieostatniego pola 'static'. Jednak stałe można wprowadzić, więc różnica jest fikcyjna. –

+0

zmienna lokalna może być bardzo dobrze zoptymalizowana. w niektórych przypadkach można go wyeliminować. w innych można uzyskać do niego dostęp za pomocą bardzo szybkich instrukcji, które działają relatywnie do stosu lub wskaźnika bazowego. zmienne statyczne muszą być zawsze dostępne przy użyciu ich pełnego adresu. – loonytune

Powiązane problemy