Some Kotlin delegates examples
- property delegates and class delegates
Some Kotlin delegates examples
class ListWithTrash<T>( | |
private val innerList: MutableList<T> = ArrayList() | |
) : MutableList<T> by innerList { | |
var deletedItem: T? = null | |
fun recover() = deletedItem | |
override fun remove(element: T): Boolean { | |
deletedItem = element | |
return innerList.remove(element) | |
} | |
override fun removeAt(index: Int): T { | |
return innerList.removeAt(index).also { | |
deletedItem = it | |
} | |
} | |
} | |
fun main() { | |
val lista = ListWithTrash<String>(arrayListOf("One","Two","Three")) | |
lista.removeAt(1) | |
println(lista.recover()) | |
} |
import java.net.NetworkInterface | |
import kotlin.properties.Delegates | |
import kotlin.properties.ReadWriteProperty | |
import kotlin.reflect.KProperty | |
class PropertyDelegates { | |
val stream: NetworkInterface by lazy { | |
NetworkInterface.getNetworkInterfaces().asSequence().first { it.isUp } | |
} | |
var subscibers: Number by Delegates.observable(0) { property, oldValue, newValue -> | |
println("${property.name} has been changed from $oldValue to $newValue") | |
} | |
var counter: Int by Delegates.vetoable(0){ property, oldValue, newValue -> | |
return@vetoable if (newValue > oldValue) true else throw IllegalArgumentException("New value must be larger than old value") | |
} | |
var id: Int by Delegates.notNull() | |
fun initialize(_id: Int){ | |
id = _id | |
} | |
} | |
class Person(_firstName: String, _lastName: String){ | |
var firstName: String by NameFormatter(_firstName) | |
var lastName: String by NameFormatter(_lastName) | |
} | |
class NameFormatter(initialValue: String): ReadWriteProperty<Person,String>{ | |
private var formattedValue: String = format(initialValue) | |
override fun getValue(thisRef: Person, property: KProperty<*>): String = formattedValue | |
override fun setValue(thisRef: Person, property: KProperty<*>, value: String) { | |
formattedValue = format(value) | |
} | |
private fun format(value: String): String{ | |
return value.trim().lowercase().capitalize() | |
} | |
} | |
fun main() { | |
val person = Person("jOhnnY ","depp") | |
println("${person.firstName} ${person.lastName}") | |
} |
data class Author(val id: String,val name: String,val books: List<String>) | |
data class Book(val id: String,val name: String, val author: String) | |
interface AuthorsRepository{ | |
fun getAuthorById(id: String): Author | |
fun getAuthorByName(id: String): Author | |
fun getAllAuthors(): List<Author> | |
} | |
interface BooksRepository{ | |
fun getBookById(id: String): Book | |
fun getBookByName(id: String): Book | |
fun getAllBooks(): List<Book> | |
} | |
class AuthorsRepositoryImpl: AuthorsRepository{ | |
val someAuthor = Author(id = "23rfdfsd",name = "Herman Smallville", listOf("4ffssds3")) | |
override fun getAuthorById(id: String): Author { | |
return someAuthor | |
} | |
override fun getAuthorByName(id: String): Author { | |
return someAuthor | |
} | |
override fun getAllAuthors(): List<Author> { | |
return listOf(someAuthor) | |
} | |
} | |
class BooksRepositoryImpl: BooksRepository{ | |
val someBook = Book(id = "4ffssds3",name = "Bobby Dick", "23rfdfsd") | |
override fun getBookById(id: String): Book { | |
return someBook | |
} | |
override fun getBookByName(id: String): Book { | |
return someBook | |
} | |
override fun getAllBooks(): List<Book> { | |
return listOf(someBook) | |
} | |
} | |
class CatalogRepository( | |
private val booksRepository: BooksRepository, | |
private val authorsRepository: AuthorsRepository | |
): BooksRepository by booksRepository, AuthorsRepository by authorsRepository{ | |
fun getBookAndAuthor(bookId: String): Pair<Book,Author>{ | |
val book = booksRepository.getBookById(bookId) | |
val author = authorsRepository.getAuthorById(book.author) | |
return book to author | |
} | |
fun getAllBooksByAuthorName(name: String): List<Book>{ | |
val author = authorsRepository.getAuthorByName(name) | |
return author.books.map { booksRepository.getBookById(it) } | |
} | |
} | |
fun main(){ | |
val catalogRepository = CatalogRepository(BooksRepositoryImpl(),AuthorsRepositoryImpl()) | |
catalogRepository.getAllBooksByAuthorName("") | |
} |