Обычно лучше получить доступ к синглтону непосредственно из его собственного класса.
В этом случае:
org.fun.ScalaPower$.MODULE$.showMyPower(10);
Не вдаваясь в подробности реализации, Scala различает пространства имен между Object иКласс / Тр.Это означает, что они могут использовать то же имя.Однако у объекта есть класс, и поэтому ему требуется искаженное имя в JVM.Текущие соглашения Scala заключаются в добавлении $ в конце имени модуля (для модулей верхнего уровня).Если объект определен в классе, я считаю, что соглашение - OuterClass $ ModuleName $.Для реализации свойства singleton модуля ScalaPower есть также статический член MODULE $ класса ModuleName $.Это инициализируется во время загрузки класса, гарантируя, что существует только один экземпляр.Побочным эффектом этого является то, что вы должны , а не делать какие-либо блокировки в конструкторе модуля.
В любом случае, Scala также встроила в него «сделать вещи лучше для Java»механизм статических форвардеров.Здесь он записывает статические методы для класса ScalaPower, которые просто вызывают ScalaPower $ .MODULE $ .someMethod ().Если вы также определите сопутствующий класс, сгенерированные серверы пересылки будут ограничены, так как вам не разрешено конфликтовать с именами со статическими методами и методами уровня экземпляра в JVM.Я думаю, что в 2.8.0 это означает, что если у вас есть объект-компаньон, вы потеряете свои статические перенаправители.
В этом случае «наилучшей практикой» будет всегда использовать ссылку ScalaPower $ .MODULE $ вместостатический экспедитор, так как он может исчезнуть с модификациями класса ScalaPower.
РЕДАКТИРОВАТЬ: Опечатка