Scala nie ma statycznego słowa kluczowego , ale zamiast tego ma podobną funkcjonalność dzięki obiektom towarzyszącym. Za kulisami obiekty towarzyszące są kompilowane do klas, które mają metody statyczne, więc wszystko to jest cukrem składniowym. Jakie są zalety tego wyboru projektu? Niedogodności? Czy inne języki mają podobne konstrukcje?
50
Odpowiedzi:
Oto kilka powodów, które mogą być dla Ciebie mniej lub bardziej atrakcyjne, w zależności od twoich preferencji:
Nie lekceważ tego za bycie „cukrem syntaktycznym”. Chociaż możesz powiedzieć, że coś jest po prostu cukrem syntaktycznym, to przecież cukier słodzi twoje życie - jako programista, a także pijący kawę lub herbatę.
Singletony - każda Scala
object
jest z natury singletonem. Biorąc pod uwagę, że w świecie Java ludzie wdrażają singletony na wiele różnych sposobów i częściej popełniają jakiś błąd w ich implementacji, nie można popełnić tak prostego błędu w Scali. Pisanieobject
zamiastclass
sprawia, że jest to singleton i gotowe.Dostęp do metod statycznych: Do metod statycznych w Javie można uzyskać dostęp z obiektów. Załóżmy na przykład, że masz klasę
C
z metodą statycznąf
i obiektc
typuC
. Następnie powinieneś zadzwonićC.f
, ale Java pozwala (choć z ostrzeżeniem) na użyciec.f
, które, kiedy pochodzisz z tła Scali, nie ma żadnego sensu, ponieważ obiekty takf
naprawdę nie mają metody .Wyraźne rozdzielenie: w Javie możesz łączyć atrybuty i metody statyczne i niestatyczne w klasie. Jeśli pracujesz zdyscyplinowany, nie staje się to problemem, ale jeśli ty (lub ktoś inny w tej sprawie) tego nie robisz, to skończy się to przeplataniem części statycznych i niestatycznych i trudno jest to stwierdzić na pierwszy rzut oka co jest statyczne, a co nie. W Scali wszystko, co znajduje się w obiekcie towarzyszącym, jest jasne, że nie jest częścią obiektów wykonawczych odpowiedniej klasy, ale jest dostępne z kontekstu statycznego. Odwrotnie, jeśli jest napisany wewnątrz klasy, jest dostępny dla instancji tej klasy, ale nie z kontekstu statycznego. Staje się to szczególnie uciążliwe w Javie, gdy zaczniesz dodawać statyczne i niestatyczne bloki inicjujące do swojej klasy. Może to być bardzo trudne do zrozumienia pod względem dynamicznej kolejności wykonywania.
Mniej kodu: Nie musisz dodawać słowa static do każdego atrybutu lub metody w
object
, dzięki czemu kod jest bardziej zwięzły (w rzeczywistości nie jest to znacząca zaleta).Wady są znacznie trudniejsze do znalezienia. Można argumentować, że części statyczne i niestatyczne powinny należeć do siebie, ale są oddzielone koncepcją Scala obiektów towarzyszących. Na przykład może wydawać się dziwne mieć diagram klas, ale w końcu trzeba stworzyć dwie rzeczy w kodzie i przeanalizować, który atrybut idzie gdzie.
źródło
ifnonnull
kod bajtowy itp., w porównaniu z prostyminvokeStatic
.Kolejną zaletą jest to, że
object
mogą implementować interfejsy / cechy, w przeciwieństwie do metod statycznych.źródło
Obiekty towarzyszące są pierwszym miejscem poszukiwania implikacji, po czym scala patrzy na Predef, a następnie w wyraźnych instrukcjach „importowania” w tym konkretnym pliku źródłowym.
Nie jestem wystarczającym programistą Java, aby wiedzieć, czy język Java lub biblioteki zapewniają porównywalny mechanizm.
źródło