Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Delegations no Kotlin
Felipe Rodrigues
Android Developer
Stone Pagamentos
@lipitchu
facebook.com/filpgame
@filpgame
filpgame@gmail.com
O Problema class Client
{
String firstName, lastName, username,
email;
}
O Problema
interface Auth {
void login();
}
class Client implements Auth
{
String firstName, lastName, username,
email;
@O...
O Problema
interface Auth {
void login();
}
interface Access {
boolean isAdmin();
}
class Client implements Auth, Access
{...
O Problema
interface Auth {
void login();
}
interface Access {
boolean isAdmin();
}
interface Finances {
long balance();
}...
Delegation?
“ Delegation is an
implementation mechanism in
which an object forwards or
delegates a request to another
obje...
interface Loggable {
public void log(String message);
}
interface Loggable {
public void log(String message);
}
class ConsoleLogger implements Loggable {
@Override
public void lo...
interface Loggable {
public void log(String message);
}
class ConsoleLogger implements Loggable {
@Override
public void lo...
interface Loggable {
public void log(String message);
}
class ConsoleLogger implements Loggable {
@Override
public void lo...
Pra que usar isso?
- Reusabilidade;
Pra que usar isso?
- Reusabilidade;
- Baixo Acoplamento;
Pra que usar isso?
- Reusabilidade;
- Baixo Acoplamento;
- Herança Dinâmica;
Pra que usar isso?
- Reusabilidade;
- Baixo Acoplamento;
- Herança Dinâmica;
- Separação de Responsabilidade;
interface Loggable {
public void log(String message);
}
class ConsoleLogger implements Loggable {
@Override
public void lo...
interface Loggable {
fun log(message: String)
}
class ConsoleLogger : Loggable {
override fun log(msg: String) = println(m...
Delegated Properties
Como usar
class NameDelegate() {
var name: String = "Felipe"
operator fun getValue(ref: Any?, prop: KProperty<*>): String ...
Como usar
class NameDelegate() {
var name: String = "Felipe"
operator fun getValue(ref: Any?, prop: KProperty<*>): String ...
Como usar
class NameDelegate() {
var name: String = "Felipe"
operator fun getValue(ref: Any?, prop: KProperty<*>): String ...
Como usar
class NameDelegate(): ReadWriteProperty<Any?, String> { // ou ReadOnlyProperty
var name: String = "Felipe"
overr...
Delegations Properties Padrão
● Lazy
val database: Database by lazy {
println("created!")
Database()
}
fun main(args: Arra...
Delegations Properties Padrão
● Lazy
val database: Database by lazy {
println("created!")
Database()
}
fun main(args: Arra...
Delegations Properties Padrão
● Observable
import kotlin.properties.Delegates
class User {
var name: String by Delegates.o...
Delegations Properties Padrão
● Observable
import kotlin.properties.Delegates
class User {
var name: String by Delegates.o...
Delegations Properties Padrão
● Armazenar em um Map
class User(val map: Map<String, Any?>) {
val name: String by map
val a...
Delegations Properties Padrão
● Armazenar em um Map
class User(val map: Map<String, Any?>) {
val name: String by map
val a...
Libs usando delegations
● KotPref
(github.com/chibatching/Kotpref)
object UserInfo : KotprefModel() {
var name by stringPr...
Dúvidas?
Nächste SlideShare
Wird geladen in …5
×

TDC2017|SP - Trilha Android Usando Delegations no Kotlin

155 Aufrufe

Veröffentlicht am

Usando Delegations no Kotlin

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

TDC2017|SP - Trilha Android Usando Delegations no Kotlin

  1. 1. Delegations no Kotlin
  2. 2. Felipe Rodrigues Android Developer Stone Pagamentos @lipitchu facebook.com/filpgame @filpgame filpgame@gmail.com
  3. 3. O Problema class Client { String firstName, lastName, username, email; }
  4. 4. O Problema interface Auth { void login(); } class Client implements Auth { String firstName, lastName, username, email; @Override public void login() { } }
  5. 5. O Problema interface Auth { void login(); } interface Access { boolean isAdmin(); } class Client implements Auth, Access { String firstName, lastName, username, email; @Override public void login() { } @Override public boolean isAdmin() { } }
  6. 6. O Problema interface Auth { void login(); } interface Access { boolean isAdmin(); } interface Finances { long balance(); } class Client implements Auth, Access, Finances { String firstName, lastName, username, email; @Override public void login() { } @Override public boolean isAdmin() { } @Override public long balance() { } }
  7. 7. Delegation? “ Delegation is an implementation mechanism in which an object forwards or delegates a request to another object. ”
  8. 8. interface Loggable { public void log(String message); }
  9. 9. interface Loggable { public void log(String message); } class ConsoleLogger implements Loggable { @Override public void log(String message) { System.out.println(message); } } class ToastLogger implements Loggable { Context context; public ToastLogger(Context context) { this.context = context; } @Override public void log(String message) { Utils.showToast(context, message); } }
  10. 10. interface Loggable { public void log(String message); } class ConsoleLogger implements Loggable { @Override public void log(String message) { System.out.println(message); } } class ToastLogger implements Loggable { Context context; public ToastLogger(Context context) { this.context = context; } @Override public void log(String message) { Utils.showToast(context, message); } } class Worker implements Loggable { public Loggable logger; public Worker(Loggable logger) { this.logger = logger; } @Override public void log(String message) { logger.log(message); } public void doWork() { log( "Working"); } }
  11. 11. interface Loggable { public void log(String message); } class ConsoleLogger implements Loggable { @Override public void log(String message) { System.out.println(message); } } class ToastLogger implements Loggable { Context context; public ToastLogger(Context context) { this.context = context; } @Override public void log(String message) { Utils.showToast(context, message); } } class Worker implements Loggable { public Loggable logger; public Worker(Loggable logger) { this.logger = logger; } @Override public void log(String message) { logger.log(message); } public void doWork() { log( "Working"); } } Worker worker = new Worker(new ConsoleLogger()); worker.logger = new ToastLogger(getContext()); worker.doWork();
  12. 12. Pra que usar isso? - Reusabilidade;
  13. 13. Pra que usar isso? - Reusabilidade; - Baixo Acoplamento;
  14. 14. Pra que usar isso? - Reusabilidade; - Baixo Acoplamento; - Herança Dinâmica;
  15. 15. Pra que usar isso? - Reusabilidade; - Baixo Acoplamento; - Herança Dinâmica; - Separação de Responsabilidade;
  16. 16. interface Loggable { public void log(String message); } class ConsoleLogger implements Loggable { @Override public void log(String message) { System.out.println(message); } } class ToastLogger implements Loggable { Context context; public ToastLogger(Context context) { this.context = context; } @Override public void log(String message) { Utils.showToast(context, message); } } class Worker implements Loggable { public Loggable logger; public Worker(Loggable logger) { this.logger = logger; } @Override public void log(String message) { logger.log(message); } public void doWork() { log( "Working"); } } Worker worker = new Worker(new ConsoleLogger()); worker.logger = new ToastLogger(getContext()); worker.doWork();
  17. 17. interface Loggable { fun log(message: String) } class ConsoleLogger : Loggable { override fun log(msg: String) = println(msg) } class ToastLogger(val context: Context) : Loggable { override fun log(msg: String) = toast(msg) } class Worker(var logger: Loggable) : Loggable by logger { fun doWork() { log("Working...") } } val worker = Worker(ConsoleLogger()) worker.logger = ToastLogger(context) worker.doWork()
  18. 18. Delegated Properties
  19. 19. Como usar class NameDelegate() { var name: String = "Felipe" operator fun getValue(ref: Any?, prop: KProperty<*>): String { println("valor '$value' de '${prop.name}'sendo entregue para $ref") return name } operator fun setValue(ref: Any?, prop: KProperty<*>, value: String) { println("’$value’ atribuido à ‘${prop.name}’ em $ref.'") name = value } } val name: String by NameDelegate()
  20. 20. Como usar class NameDelegate() { var name: String = "Felipe" operator fun getValue(ref: Any?, prop: KProperty<*>): String { println("valor '$value' de '${prop.name}'sendo entregue para $ref") return name } operator fun setValue(ref: Any?, prop: KProperty<*>, value: String) { println("’$value’ atribuido à ‘${prop.name}’ em $ref.'") name = value } } val name: String by NameDelegate()
  21. 21. Como usar class NameDelegate() { var name: String = "Felipe" operator fun getValue(ref: Any?, prop: KProperty<*>): String { println("valor '$value' de '${prop.name}'sendo entregue para $ref") return name } operator fun setValue(ref: Any?, prop: KProperty<*>, value: String) { println("’$value’ atribuido à ‘${prop.name}’ em $ref.'") name = value } } var name: String by NameDelegate()
  22. 22. Como usar class NameDelegate(): ReadWriteProperty<Any?, String> { // ou ReadOnlyProperty var name: String = "Felipe" override fun getValue(ref: Any?, prop: KProperty<*>): String { println("valor '$value' de '${prop.name}'sendo entregue para $ref") return name } override fun setValue(ref: Any?, prop: KProperty<*>, value: String) { println("’$value’ atribuido à ‘${prop.name}’ em $ref.'") name = value } } val name: String by NameDelegate()
  23. 23. Delegations Properties Padrão ● Lazy val database: Database by lazy { println("created!") Database() } fun main(args: Array<String>) { println(database.isConnected()) println(database.isConnected()) }
  24. 24. Delegations Properties Padrão ● Lazy val database: Database by lazy { println("created!") Database() } fun main(args: Array<String>) { println(database.isConnected()) println(database.isConnected()) } Output: created! false false
  25. 25. Delegations Properties Padrão ● Observable import kotlin.properties.Delegates class User { var name: String by Delegates.observable( "Sicrano") { prop, oldValue, newValue -> println("$oldValue -> $newValue") } } val user = User() user.name = "Fulano" user.name = "Beltrano"
  26. 26. Delegations Properties Padrão ● Observable import kotlin.properties.Delegates class User { var name: String by Delegates.observable( "Sicrano") { prop, oldValue, newValue -> println("$oldValue -> $newValue") } } val user = User() user.name = "Fulano" user.name = "Beltrano" Output: Sicrano -> Fulano Fulano -> Beltrano
  27. 27. Delegations Properties Padrão ● Armazenar em um Map class User(val map: Map<String, Any?>) { val name: String by map val age: Int by map } val user = User(mapOf( "name" to "John Doe", "age" to 25 )) println("Name: ${user.name}, Age: ${user.age}")
  28. 28. Delegations Properties Padrão ● Armazenar em um Map class User(val map: Map<String, Any?>) { val name: String by map val age: Int by map } val user = User(mapOf( "name" to "John Doe", "age" to 25 )) println("Name: ${user.name}, Age: ${user.age}") Output: Name: John Doe, Age: 25
  29. 29. Libs usando delegations ● KotPref (github.com/chibatching/Kotpref) object UserInfo : KotprefModel() { var name by stringPref() var code by nullableStringPref() var age by intPref(default = 14) var highScore by longPref() var rate by floatPref() val prizes by stringSetPref { val set = TreeSet<String>() set.add( "Beginner") set } } UserInfo.name = "User" UserInfo.code = "Test"
  30. 30. Dúvidas?

×