2013-08-09 9 views
25

Czy nieużywany import, taki jak ten - importuje android.widget.RelativeLayout; jeść pamięć? Chcesz tylko wiedzieć, ile to kosztuje? Może to głupie pytanie, ale nie znalazłem odpowiedzi.Czy nieużywana deklaracja importu je pamięci w języku Java?

+0

Możliwy duplikat [Czy niewykorzystane import i obiekty mają wpływ na wydajność] (http://stackoverflow.com/questions/8724045/does-unused-import-and -obiekty mają wpływ na wydajność) – jonayreyes

Odpowiedz

45

Nie biorą żadnej pamięci. Importowane pliki są używane przez kompilator do rozpoznawania nazw klas podczas kompilacji.

Kompilator zmienia nazwę każdej klasy na pełną nazwę. I usuwa instrukcję importu. Tak więc instrukcja importu nie przechodzi do kodu bajtowego.

Jedynym problemem, który może wystąpić w przypadku importu za pomocą symboli wieloznacznych, jest konflikt przestrzeni nazw, tj. Gdy dwa typy o tej samej nazwie są zdefiniowane w dwóch różnych pakietach, wówczas zaimportowanie tych pakietów za pomocą symboli wieloznacznych spowoduje konflikt nazw dla tego typu.


Aby zobaczyć, jak kompilator zastępuje instrukcji import, można wygenerować kod bajtowy swojej klasie przy użyciu polecenia javap. Rozważmy poniższy kod:

import java.util.*; 
import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 

    } 
} 

prostu skompilować powyższy kod i sprawdzić kod bajtowy za pomocą następującego polecenia:

javap Test 

daje się następujący wynik:

public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
} 

Więc, możesz zobaczyć, że typ String jest zastąpiony jego pełną nazwą java.lang.String, a nie ma instrukcji importu w kodzie bajtowym.

+0

Dziękuję, proszę pana! –

+0

Ta odpowiedź ma sens, ale miałem problemy w moim projekcie Java, które wydają się temu zaprzeczać. Mogę skompilować klasę, uruchomić program, który może zaciemnić niektóre importy i ich odniesienia, aby działał z jakimś innym zaciemnionym kodem, następnie dekompilować tę klasę i zobaczyć niektóre instrukcje importu dla starych, teraz zaciemnionych klas. Jeśli te klasy nigdy nie są używane w kodzie, w jaki sposób dekompiler pobiera te instrukcje importu? Czy nie powinni byli zgubić się w kompilacji? (Czy powinienem to opublikować jako nowe pytanie?) – Variadicism

+0

Nieważne. Zapomnij o tym. Wierzę, że reobfuscator po prostu robi pół-pracy. Uważam, że dlatego oświadczenia dotyczące importu nadal istnieją. Dekompilator prawdopodobnie pisze w tych instrukcjach importu tylko po to, by wyglądał ładniej. – Variadicism

1

Niewykorzystane importu nie mają wpływu w czasie wykonywania (ponieważ nie ma przywozu w kodzie bajtowym). Jednak nieużywany import wpłynie na kompilator, ale nie za dużo.

Ogólnie rzecz biorąc, importowanie tylko tego, czego potrzebujesz, prowadzi do poprawy łatwości konserwacji i czytelności kodu.

11

Nie, kompilator usuwa je po kompilacji. Ale dwa kwestia może napotkać

  1. Kod bałaganu
  2. W przypadku importowania niektórych klas z słoik i później usunięte słoik, ale nie importu, wtedy może pojawić się błąd kompilacji czas
2

żadnego wpływu na starcie. Dzięki temu proces kompilacji może być bardzo mały (wolniejszy) niż wolniej. Ale jeśli chodzi o ich posiadanie, lepiej je usunąć, ponieważ powoduje to, że pliki są mniejsze i ułatwia to odczytanie, jakiego importu rzeczywiście używa.

+0

+1 dla aspektu dokumentowania samego siebie. To zawsze był mój główny powód wyraźnego importu tylko tych klas, które są używane. –

0

Brak wpływu dowolny czas rumtime kompilator,

ale najlepszym rozwiązaniem jest napisanie najczystszy i najprostszy kod można jak to poprawia konserwacji kodu oraz pomaga zapewnić wykonuje dość dobrze nawet po to zmienione.

Dokumentacja: Best Practices for Performance

Powiązane problemy