To pozycja nr 74 skutecznej książki java jest paragraf (2 para od ostatniego punktu 74), który wspomina, jak na poniżej:Efektywna Java Nr 74 (na serializacji): Wdrożenie Serializable rozważnie
Klasy wewnętrzne (pozycja 22) nie powinny implementować Serializable. Używają one syntetycznych pól generowanych przez kompilator do przechowywania odwołań do obudowań instancji i do przechowywania wartości zmiennych lokalnych z zakresu obejmującego zakresy . Sposób, w jaki te pola odpowiadają definicji klasy, jest nieokreślony, podobnie jak nazwy klas anonimowych i lokalnych. Dlatego domyślna serializowana postać klasy wewnętrznej jest zdefiniowana jako niezdefiniowana.
Wiem o klasie wewnętrznej używa pola syntetycznego generowanego przez kompilator do przechowywania odwołania do zamkniętych wystąpień, np. jeśli otaczającą klasą jest MyEnclosing, a wewnętrzną klasą jest MyInner, wówczas otaczającym odnośnikiem jest MyEnclosing.this. Ale nie jestem w stanie uzyskać części BOLD. Pomóż mi zrozumieć znaczenie. Dzięki!!!
dzięki za wysiłek. Zasadniczo masz na myśli, że val $ a jest zmienną przechowywaną w klasie wewnętrznej przez kompilator, który (val $ a) jest częścią zewnętrznej klasy. Mam rację? Jeśli mam rację, to nie jest serializowanie klasy wewnętrznej. Zasadniczo nie jestem w stanie uzyskać "Ale dokładne nazwy do wykorzystania w tej sytuacji nie są częścią części specyfikacji kompilatora". – Trying
Jestem prawie pewien, że widziałem pliki klas z konwencją nazewnictwa, która nazwałaby wewnętrzną klasę tutaj 'OuterClass $ method $ 1' zamiast' OuterClass $ 1' (chociaż wypróbowałem teraz kilka kompilatorów i nie byłem w stanie aby to powtórzyć). Chodzi o to, że [spec] (http://jcp.org/aboutJava/communityprocess/maintenance/JLS/innerclasses.pdf) wymaga tylko, aby kompilator tworzył unikalną nazwę, dołączając kombinację $, liter i liczby po nazwie klasy zamykającej. A jeśli nazwa klasy się zmieni, deserializacja zakończy się niepowodzeniem. –
Jestem nieco zdezorientowany ... Dlaczego twoja anonimowa klasa "Runnable" zostanie przekształcona do postaci szeregowej, gdy serializujesz "this"? Tylko pola twojej zewnętrznej klasy są serializowane. I pytanie właściwie odnosi się do wewnętrznej/lokalnej/anonimowej klasy, która sama jest "Serializable" ... –