2015-11-17 5 views
3

Я делал несколько экспериментов с Котлином, и я играл с одноэлементными узорами. Я хотел сохранить один экземпляр объекта Database. Как и на Java, я думал, что оберну его синглом.Kotlin - единственный экземпляр класса, не являющегося одиночным?

import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl 
import com.github.davidmoten.rx.jdbc.Database 

object DbManager { 
    val database : Database = 
      Database.from(ConnectionProviderFromUrl("jdbc:sqlite:C:/Users/Thomas/OneDrive/Data/finance_rx.db").get()) 
} 

Что меня удивили, однако, по-видимому, нет встроенного способа собрать добытчик для него (как свойства для класса). Это было просто прямо, разоблачая то, что database собственность миру без инкапсуляции, которой я не хотел.

Я мог бы просто сделать это частным и явно сделать свой собственный геттер (но я смотрю на Котлина, потому что я увлечен ленивым). Однако, я думаю, я наткнулся на другой способ сделать это.

Я мог бы создать файл Kotlin и объявить приватную переменную и публичную функцию, чтобы инкапсулировать и подвергать ее безопасности, не помещая ее ни в какой класс или в singleton вообще!

import com.github.davidmoten.rx.jdbc.ConnectionProviderFromUrl 
import com.github.davidmoten.rx.jdbc.Database 

private val database : Database = 
     Database.from(ConnectionProviderFromUrl("jdbc:sqlite:C:/Users/Thomas/OneDrive/Data/finance_rx.db").get()) 

fun db(): Database = database; 

Дело в том, что это просто слишком легко. Я чувствую, что делаю что-то плохое. Но в то же время это имеет смысл. Никто не любит звонить MySingleton.getInstance().getDb() сто раз. Является ли этот шаблон открытым, а не анти-шаблоном?

Также существует ли способ скомпилировать геттеры и инкапсулировать конечные свойства на одноэлементный? Или я сам реализую эти методы?

ответ

9

Является ли этот шаблон открытым, а не анти-шаблоном?

Да, это правильный образец

Кроме того, есть ли способ для компиляции добытчиков и инкапсулировать конечные свойства на синглтоне? Или я сам реализую эти методы?

Котлин свойства не только поля: они уже есть добытчиками, сгенерированные для них, так что наличие database и db() не лучше, чем просто database.

Если вам необходимо изменить поведение свойства позже без перекомпиляции клиентов, вы можете написать специальный поглотитель:

val database: Database 
    get() = ... 

Это будет просто изменить тело добытчика, который в противном случае автоматически создается для вас

+1

Большое спасибо Андрей, я был в замешательстве, потому что я обращался к классу Kotlin из кода Java (который показывал явные getters для взаимодействия). Я ожидал этого к тому же, когда обращался к нему прямо в Котлин. Я понял, это похоже на C#. – tmn

+0

На стороне примечания, еще раз спасибо за то, чтобы собрать этот отличный язык. Это все и многое другое, что я хотел, чтобы Java была (особенно из C# в качестве моего первого языка). – tmn

Смежные вопросы