2012-05-28 17 views
9

Możliwe zduplikowane:
what happens to an object in Java if you do not reference it, like here : myString.concat(“that”)Dlaczego nie jest konieczne przypisanie wartości zwracanej przez metodę do zmiennej?

public class ReturnTest 
{ 
    public static void main(String[] args) 
    { 
     ReturnTest rt = new ReturnTest(); 
     rt.show(); 
    } 

    public String show() 
    { 
     return "Hello"; 
    } 
} 

W powyższym kodu sposób show() zwraca wartość String które nie wychwycone przez dowolny zmiennej. Ani kompilator, ani JVM nie podnoszą żadnych ostrzeżeń, błędów ani wyjątków. To samo dotyczy pierwotnych typów zwrotu. Czemu?

Czy kompilator nie powinien zwracać uwagi na to, że żadna ważna wartość nie została zwrócona przez metodę?

Jak mogę to naprawić z powłoki?

+1

Co się stanie, jeśli przypiszesz wartość zmiennej, ale jej nie badasz? Co się stanie, jeśli go zbadasz, ale nie podejmiesz "właściwej" decyzji w oparciu o to badanie? Jak daleko chcesz to wziąć, zanim kompilator zrobi "właściwą" rzecz? –

Odpowiedz

10

To jest konstrukcja języka.

W wielu przypadkach metody zwracają wartość, której nie obchodzi. Na przykład: StringBuilder.append() zwraca sam obiekt.

To prawda, że ​​w niektórych przypadkach może zostać utracona ważna wartość zwracana. Na przykład InputStream.skip(long n) zwraca liczbę pominiętych bajtów. I read zwraca liczbę odczytanych bajtów. Istnieją pewne narzędzia (Checkstyle, FindBugs), które wykrywają takie błędy. Ale sam język nie wymaga sprawdzenia wartości zwracanej. A nawet gdyby tak było, program mógł zignorować wartość.

+0

Nie używam żadnego IDE, jak mogę to naprawić poprzez powłokę? – WickeD

+2

Możesz uruchomić Checkstyle i FindBugs w wierszu poleceń lub jako część kompilacji. Ale dlaczego nie używasz IDE? –

3

Ponieważ niekoniecznie potrzebujesz zwracanej wartości.

+0

moje pytanie brzmi: w jaki sposób java uznał, że nie potrzebujemy zwracanej wartości? – WickeD

+0

nie. Po prostu nie jest przypisany. – Bozho

+2

Zakłada się, że programista wie, co robi. Jeśli nie przechowują zwróconej wartości, nie są potrzebne. –

1

W funkcjach java nie są czyste, więc mogą być uruchamiane tylko w przypadku skutków ubocznych. W tym przypadku nie ma żadnych skutków ubocznych ... Rozważ

public String show() { 
    System.out.println("Hello"); 
    return "Hello"; 
} 

Teraz chcesz ostrzeżenie? Kompilator nie może wiedzieć, czy uruchomiłeś go dla efektu ubocznego, czy wartości, więc po co nalegać?

3

Możesz dodać adnotację do metody z @CheckReturnValue, jeśli zawsze powinieneś używać jej wartości zwracanej. Analiza statyczna kodu, taka jak FindBug, uwzględnia tę adnotację i ostrzega, gdy ją naruszasz.

Przynajmniej jest to bardzo rozsądne, gdy metoda zwraca obiekt, który wymaga końcowego przetwarzania na końcu, za który odpowiada osoba wywołująca. Dotyczy to zasobów, które muszą zostać zamknięte na końcu. Blokady, które muszą zostać zwolnione pod koniec ...

Powiązane problemy