2011-08-18 12 views
9

W wielu klasach projektu pracuję nad widzę private static końcowych użytkowników nazwanych CLASS_NAME, które są zdefiniowane tak:Czy class.getName() jest drogi?

public class MyClass { 
    private static final String CLASS_NAME = MyClass.class.getName(); 
    //... 
} 

Jakie są korzyści, jeśli w ogóle, w ten sposób, aby uzyskać klasę zamiast dzwonić bezpośrednio na numer MyClass.class.getName(), tam gdzie jest to potrzebne?

Odpowiedz

10

Oto realizacja Class.getName()

public String getName() { 
if (name == null) 
    name = getName0(); 
return name; 
} 

Jak widać wartość nazwy są buforowane, więc połączenie nie jest zbyt drogie. To tak samo jak zwykły kupiec. W każdym razie, jeśli często to nazywasz, prawdopodobnie dobrym stylem jest definiowanie stałej.

1

Nie, to wcale nie jest drogie. Jedyne korzyści, jakie mogę sobie wyobrazić, to to, że IDE może szybko pokazać ci, gdzie używana jest ta konkretna stała, a dla długich nazw klas stała będzie krótsza, dzięki czemu kod będzie trochę czystszy.

0

Musimy zobaczyć cały kod, aby zobaczyć, jak jest używany CLASS_NAME. Jest jednak prawdopodobne, stosowane gdzie indziej, na przykład można go używać z log4j tak:

// Log4j . Logger --- Get class name in static context by creating an anonymous Throwable and 
// getting the top of its stack-trace. 
// NOTE you must use: getClassName() because getClass() just returns StackTraceElement.class 
static final Logger logger = Logger.getLogger(new Throwable() .getStackTrace()[0].getClassName()); 

Nie jest to kosztowna operacja i jest prawdopodobne, buforowane.

6

Buforowanie nazwy klasy będzie obciążone innym odwołaniem. To przesuwa koszt opkodułów JVM (złożoność procesora) dla śladu pamięci.

W dzisiejszych czasach procesory są tak szybkie, że w zasadzie czekają na pamięć, więc jeśli trzeba było dokonać wyboru między opkodami i pamięcią, lepiej jest uruchamiać więcej opkodów za pośrednictwem maszyny JVM.

Na początku nie wydaje się to intuicyjne; ale rozważmy JVM i otaczający sprzęt. Większe ślady pamięci oznaczają mniej ostatnio używanych elementów w pamięci podręcznej, a koszt ponownego pobrania elementu, który wypada z pamięci podręcznej, wynosi od 1000 do 10 000 razy więcej niż koszt uruchomienia pojedynczego kodu operacyjnego JVM. Połącz to z silnikiem Jit JVM, a złożoność procesora dla mocno dostępnych fragmentów kodu zostanie zoptymalizowana za darmo (poza wszystkim innym).

Ogólnie, chciałbym przyciąć obiekt, nie buforując odniesienia, ponieważ pozwoliłoby to na wrzucenie większej ich liczby do pamięci podręcznej poziomu 1. Jednak, podobnie jak w przypadku całego tuningu wydajnościowego, powinieneś przetestować, czy wyniki zgadzają się z hipotezą, i wykonać testowanie w taki sposób, aby nie dać się pomylić z wszystkimi innymi wewnętrznymi funkcjami maszyny JVM.

+0

To dobra propozycja, dzięki! –

1

To nie jest drogie. Wydaje się, że jest to konwencja do celów rejestrowania.

porównać

logger.entering(CLASS_NAME, ...) 

do

logger.entering(MyClass.class.getName() ,...) 

Poza tym zalogowaniu kod nie złamać (zalogowaniu niewłaściwą klasę), gdy skopiowane do innego źródła.

Powiązane problemy