На этом шаге мы рассмотрим назначение таких объектов.
Если вы хотите связать инициализацию объекта с экземпляром класса, это можно организовать, определив вспомогательный объект. Вспомогательный объект объявляется внутри класса с помощью модификатора companion. У класса не может быть больше одного вспомогательного объекта.
Инициализация вспомогательного объекта выполняется в двух случаях: при инициализации вмещающего класса, что делает его хорошим местом для хранения данных в единственном экземпляре, имеющих контекстную связь с объявлением класса, и при прямом обращении к одному из его свойств или функций.
Так как фактически вспомогательный объект - это объявление объекта, вам не придется создавать экземпляр класса, чтобы использовать любые объявленные в нем функции или свойства. Давайте посмотрим на следующий пример вспомогательного объекта внутри класса с именем PremadeWorldMap:
class PremadeWorldMap . . . companion object { private const val MAPS_FILEPATH = "nyethack.maps" fun load() = File(MAPS_FILEPATH).readBytes() } }
У PremadeWorldMap есть вспомогательный объект с единственной функцией load(). Если потребуется вызвать load() еще где-нибудь в коде, вы сможете сделать это без создания экземпляра PremadeWorldMap, как показано ниже:
PremadeWorldMap.load()
Содержимое файла будет загружено вспомогательным объектом только один раз, во время инициализации экземпляра PremadeWorldMap или при первом вызове функции load(). И неважно, сколько экземпляров PremadeWorldMap будет создано, потому что вспомогательный объект всегда существует в единственном экземпляре.
Понимание целей и задач синглтонов, анонимных и вспомогательных объектов - это ключ к их эффективному использованию. А их эффективное использование позволит вам написать хорошо организованный и масштабируемый код.
На следующем шаге мы рассмотрим вложенные классы.