Да, в Kotlin можно сделать конструктор приватным, и это мощный инструмент для контроля создания экземпляров класса. Рассмотрим детали и практические применения.
Для primary конструктора:
class Singleton private constructor() {
// ...
}
Для secondary конструкторов:
class MyClass {
private constructor(param: Int) {
// ...
}
}
class AppSettings private constructor() {
companion object {
val instance: AppSettings by lazy { AppSettings() }
}
var theme: String = "Light"
}
// Использование:
AppSettings.instance.theme = "Dark"
class User private constructor(val id: String) {
companion object {
fun create(id: String): User {
return User(id.validateAndFormat())
}
}
}
open class Parent private constructor() {
// Класс нельзя наследовать вне файла
}
object
):class StringUtils private constructor() {
companion object {
fun capitalize(str: String): String {
return str.capitalize()
}
}
}
Для Activity/Fragment:
class MyViewModel private constructor(
private val repo: Repository
) : ViewModel() {
companion object {
fun create(factory: ViewModelProvider.Factory): MyViewModel {
return factory.create(MyViewModel::class.java)
}
}
}
Dagger/Hilt внедрение зависимостей:
class DatabaseHelper @Inject private constructor() {
// ...
}
Рефлексия:
@JvmStatic
фабрикСериализация:
Serializable
, нужен доступный конструкторserialVersionUID
Тестирование:
Объекты (object):
object
object NetworkManager {
fun request() { ... }
}
Функции верхнего уровня:
// Файл StringUtils.kt
fun capitalize(str: String): String {
return str.capitalize()
}
LocalBroadcastManager
использует приватный конструктор:
public final class LocalBroadcastManager {
private static LocalBroadcastManager mInstance;
private LocalBroadcastManager(Context context) {
// ...
}
public static synchronized LocalBroadcastManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new LocalBroadcastManager(context.getApplicationContext());
}
return mInstance;
}
}
приватные конструкторы — это мощный инструмент для инкапсуляции логики создания объектов. В Android они особенно полезны для реализации синглтонов, фабрик и ограничения наследования. Однако в Kotlin стоит также рассматривать альтернативы (object
, функции верхнего уровня), которые могут сделать код более идиоматичным.