2010-12-16 13 views
12

Możliwe jest definiowanie klas sealed w Scali, które są w zasadzie final, chyba że podklasy odbywają się w tym samym pliku.Czy klasy szczelne są egzekwowane w Javie, a jeśli tak, to w jaki sposób?

Wygląda na to, że JVM nie zezwala na klasy final z kodami podtestowymi i.

Biorąc pod uwagę, że nie ma "pojęcia" pliku źródłowego w kodzie bajtowym, w jaki sposób jest ono egzekwowane?

W związku z tym, w jaki sposób javac może uniemożliwić podklasę klasy Scala sealed w języku Java?

+0

Tak więc, aby wyjaśnić, pytasz, czy możliwe jest posiadanie "zapieczętowanych" klas w kodzie Scala uruchamianym na maszynie JVM (** nie **, czy jest to możliwe, w języku Java *, aby mieć coś podobnego do "zamknięte" klasy). Dobrze? –

+0

Co masz na myśli przez "Wygląda na to, że JVM nie pozwala na kodowanie kodu końcowego klasy"? Czy nie ma bajtów oznaczających koniec klasy? – pedrofurla

+0

@pedrofurla: AFAIK JVM nie zezwala na podklasy klas oznaczone 'final' w bajtodzie? Czy to ograniczenie jest wymuszane tylko w 'javac'? – soc

Odpowiedz

15

Ograniczenie jest egzekwowane dla źródła Scala przez skalak w czasie kompilacji. Wynikające z tego definicje klas binarnych nie mają ostatecznej flagi JVM, więc jak już zapewne odgadłeś, zamknięte ograniczenie nie zostanie wymuszone przez javac, gdy źródła Javy są kompilowane przeciwko plikom binarnym Scala.

+0

Czy byłoby to możliwe (na przykład poprzez sprawdzenie pakietu w konstruktorze "klasy zapieczętowanej"), aby wymusiło to na stronie Java/JVM, nawet jeśli jest to tylko w czasie wykonywania? – Adowrath

1

Co powiesz na użycie prywatnego konstruktora dla klasy, którą chcesz uszczelnić, a następnie utworzyć publiczne końcowe statyczne klasy wewnętrzne, które rozszerzają tę klasę. Wtedy otrzymujesz stały zestaw podklas w czasie kompilacji, którego nie można dalej rozbudowywać. Klasa bazowa z prywatnym konstruktorem służy następnie jako droga do osiągnięcia tych wewnętrznych klas, ale sama w sobie nie jest możliwa do rozszerzenia i implementacji w innym miejscu.

Powiązane problemy