2011-08-23 9 views
13

W Javie można tworzyć interfejsy pakiet-prywatne. Patrząc na nie za pomocą javap, widzisz, że brakuje im "publicznej" widoczności.Jak definiujesz pakiet-prywatną * cechę * w Scali?

W Scali można zadeklarować cechę jako prywatną [pakiet] lub chronioną [pakiet], ale patrząc na javap, jest ona nadal publiczna.

Jak zatem stworzyć pakiet-prywatną cechę w Scali?

Podczas gdy kompilator Scala respektuje widoczność, moim problemem jest to, że moje API będzie prawdopodobnie dostępne również z Java i nie chcę wystawiać mojej wewnętrznej implementacji na Javę.

Odpowiedz

10

Nie jest możliwe utworzenie prywatnych modyfikatorów pakietu Java za pomocą Scala. Można jednak dowolnie łączyć pliki Java i Scala w projekcie Scala. Najłatwiejszym rozwiązaniem jest stworzenie klasy/interfejsu Java, a następnie rozszerzenie go w Scala.

+0

Podczas gdy odpowiedź Johna była bardziej "edukacyjna", dostarczyłeś rozwiązanie, prawdopodobnie jedyne. Ponieważ większość projektów Scala jest skonfigurowanych do kompilowania Java, jest to uzasadnione. –

13

Wierzę, że to jest odpowiedź na swoje pytanie

http://www.scala-lang.org/node/10488

prywatny ma subtelnie specjalny status w specyfikacji językowych zarówno Scala i Java. Sprawdź dyskusję prywatnych i kwalifikowanych prywatnych w sekcji modyfikatorów SLS. W skrócie, prywatny to taki sam jak Java prywatny, podczas gdy prywatny [foo] nie jest oznaczony jako prywatny w bajtowym kodzie, ale po prostu wymaga kontroli dostępu podczas kompilacji.

Nie wierzę, że naprawdę można uczynić pakiet cech prywatnym po skompilowaniu go w kod bajtowy.

+0

W twoim linku, sam Martin Odersky mówi: "W skrócie, prywatne jest takie samo jak Java prywatne, podczas gdy prywatne [foo] nie jest oznaczone jako prywatne w kodzie bajtowym, ale po prostu wymaga kontroli dostępu podczas kompilacji." Co oczywiście jest w sprzeczności z dowodami, które widzę z javap, ale myślę, że mówił o członkach, konstruktorach w tym przypadku, a nie o klasach/cechach. –

+0

@Sebastien - wystarczy. Nie zauważyłem, że cały interfejs jest kompilowany do publicznego interfejsu. Niezależnie od tego, myślę, że rozwiązanie Lex jest najlepsze, jeśli chcesz, aby twoje cechy były dostępne z poziomu Javy. –