Declaraciones de objetos
Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 12 de 57.
object Name { ... } declara una clase y su única instancia en un solo paso. Usas el objeto mediante su nombre; no hay ningún constructor que llamar:
object AppConfig {
var theme = "light"
val version = "1.4"
fun describe() = "v$version, $theme theme"
}Dentro de main:
println(AppConfig.describe())
AppConfig.theme = "dark"
println(AppConfig.describe())Salida:
v1.4, light theme
v1.4, dark themeSolo hay una instancia, por lo que cada parte del programa que utiliza el objeto lee y cambia el mismo estado. El objeto se crea la primera vez que se utiliza, como muestra el bloque init de abajo:
object Visits {
var count = 0
private set
init { println("Visits created") }
fun record() { count++ }
}
fun home() = Visits.record()
fun about() { Visits.record(); Visits.record() }Dentro de main:
println("start")
home()
about()
println(Visits.count)Salida:
start
Visits created
3Un objeto no tiene constructor, porque nadie lo crea. Sus propiedades obtienen sus valores en sus declaraciones o en init. Aparte de eso, es un cuerpo de clase normal: estado privado, funciones auxiliares privadas y métodos públicos:
object IdGenerator {
private var next = 1
fun newId(prefix: String) = "$prefix-${pad(next++)}"
private fun pad(n: Int) = n.toString().padStart(3, '0')
}Dentro de main:
println(IdGenerator.newId("user"))
println(IdGenerator.newId("order"))Salida:
user-001
order-002Usa un objeto para algo de lo que existe exactamente una instancia en un programa: un registro, la configuración o un grupo de funciones auxiliares. Un objeto es un estado global que cualquier archivo puede modificar, así que mantén privados sus métodos de asignación y deja que sus métodos comprueben cada cambio.
object Units {
fun kmToMiles(km: Double) = km * 0.621371
}
Units.kmToMiles(10.0) // llamado a través del nombre
// val u = Units() // error: un objeto no tiene constructorDesafío
FácilCompleta el objeto Leaderboard. Mantiene los puntos de cada jugador en un mapa privado. add(player, points) añade puntos, top() devuelve al líder como ada 6 (si los puntos son iguales, el nombre que aparece primero alfabéticamente) o empty cuando nadie tiene puntos, reset() elimina a todos y la propiedad players es el número de jugadores.
Las funciones auxiliares recordWin y recordDraw de Functions.kt se proporcionan: utilizan Leaderboard desde otro archivo. El código proporcionado lee los comandos win ada, draw ada bo, top o reset, imprime top() para cada top y finalmente players: con el recuento.
Tu código va en Leaderboard.kt y Functions.kt. Main.kt contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
fun main() {
// Código de entrada/salida suministrado: déjalo como está
val input = generateSequence(::readLine).toList()
for (cmd in input) {
val p = cmd.split(" ")
when (p[0]) {
"win" -> recordWin(p[1])
"draw" -> recordDraw(p[1], p[2])
"reset" -> Leaderboard.reset()
else -> println(Leaderboard.top())
}
}
println("players: ${Leaderboard.players}")
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesConstructores primariosBloques init y validaciónConstructores secundariosRepaso - Tarjeta de biblioteca4Herencia
Clases abiertas y subclasesSobrescritura de miembrossuper y constructoresClases abstractasRepaso: directorio del personal2Propiedades y encapsulación
Accesores personalizadosModificadores de visibilidadSetters privadoslazy y lateinitRepaso: cuenta bancaria5Interfaces
Declaración de interfacesMétodos predeterminadosInterfaces múltiplesInterfaces como tiposRepaso: métodos de pago8Genéricos
Funciones genéricasClases genéricasRestricciones de tiposVariancia con in y outRepaso - Cola de prioridad11Proyecto: Gestión de biblioteca
Libros y miembrosPréstamo de libros3Objetos y complementos
Declaraciones de objetosObjetos complementariosConstantes con constExpresiones de objetosRepaso: taquillaPractica por tu cuenta: Playground de Kotlin