31 - POO - objeto nombrado

Otra característica del lenguaje Kotlin es poder definir un objeto en forma inmediata sin tener que declarar una clase.

Aparece una nueva palabra clave object con la que podemos crear estos objetos en forma directa.

Problema 1

Definir un objeto llamada Matematica con una propiedad que almacene el valor de PI y un método que retorne un valor aleatorio en un determinado rango.

Proyecto134 - Principal.kt

object Matematica {
    val PI = 3.1416
    fun aleatorio(minimo: Int, maximo: Int) = ((Math.random() * (maximo + 1 - minimo)) + minimo).toInt()
}

fun main(parametro: Array<String>) {
    println("El valor de Pi es ${Matematica.PI}")
    print("Un valor aleatorio entre 5 y 10: ")
    println(Matematica.aleatorio(5, 10))
}

Para definir un objeto sin tener que declarar una clase utilizamos la palabra clave object y seguidamente el nombre de objeto que vamos a crear, luego entre llaves definimos sus propiedades y métodos(en nuestro ejemplo definimos una propiedad y un método) :

object Matematica {
    val PI = 3.1416
    fun aleatorio(minimo: Int, maximo: Int) = ((Math.random() * (maximo + 1 - minimo)) + minimo).toInt()
}

Para acceder a la propiedad o el método definido en el objeto Matematica lo hacemos antecediendo el nombre del objeto al método o propiedad que tenemos que llamar:

fun main(parametro: Array<String>) {
    println("El valor de Pi es ${Matematica.PI}")
    print("Un valor aleatorio entre 5 y 10: ")
    println(Matematica.aleatorio(5, 10))
}

Objetos locales a una función o método.

Para poder definir objetos nombrados que no sean globales como el caso anterior sino que estén definidos dentro de una función lo debemos hacer definiendo una variable local y un objeto anónimo (es decir sin nombre)

Problema 2

Crear un objeto local en la función main que permita tirar 5 dados y almacenar dichos valores en un arreglo. Definir una propiedad que almacene 5 enteros y tres métodos: uno que cargue los 5 elementos del arreglo con valores aleatorios comprendidos entre 1 y 6, otro que imprima el arreglo y finalmente otro que retorne el mayor valor del arreglo.

Proyecto135 - Principal.kt

fun main(parametro: Array<String>) {
    val dados = object {
        val arreglo = IntArray(5)
        fun generar() {
            for(i in arreglo.indices)
                arreglo[i] = ((Math.random() * 6) + 1).toInt()
        }

        fun imprimir() {
            for(elemento in arreglo)
                print("$elemento - ")
            println();
        }

        fun mayor(): Int {
            var may = arreglo[0]
            for(i in arreglo.indices)
                if (arreglo[i] > may)
                    may = arreglo[i]
            return may
        }
    }

    dados.generar()
    dados.imprimir()
    print("Mayor valor:")
    println(dados.mayor())
}

Para definir un objeto local a una función debe ser anónimo, es decir no disponemos un nombre después de la palabra clave object.
Lo que debemos hacer es asignar el valor devuelto por object a una variable:

    val dados = object {

Dentro de las llaves de object definimos las propiedades e implementamos sus métodos:

        fun generar() {
            for(i in arreglo.indices)
                arreglo[i] = ((Math.random() * 6) + 1).toInt()
        }

        fun imprimir() {
            for(elemento in arreglo)
                print("$elemento - ")
            println();
        }

        fun mayor(): Int {
            var may = arreglo[0]
            for(i in arreglo.indices)
                if (arreglo[i] > may)
                    may = arreglo[i]
            return may
        }
    }

Luego podemos acceder a las propiedades y sus métodos antecediendo el nombre de la variable que se carga al llamar object:

    dados.generar()
    dados.imprimir()
    print("Mayor valor:")
    println(dados.mayor())

Problema propuesto

  • Definir un objeto nombrado:
    object Mayor {
    
    con tres métodos llamados "maximo" con dos parámetros cada uno. Los métodos difieren en que uno recibe tipos de datos Int, otro de tipos Float y finalmente el último recibe tipos de datos Double. Los tres métodos deben retornar el mayor de los dos datos que reciben.
Solución
Proyecto136

object Mayor {
    fun maximo(x1: Int, x2: Int) = if (x1 > x2) x1 else x2
    fun maximo(x1: Float, x2: Float) = if (x1 > x2) x1 else x2
    fun maximo(x1: Double, x2: Double) = if (x1 > x2) x1 else x2
}

fun main(parametro: Array<String>) {
    println(Mayor.maximo(4, 5))
    println(Mayor.maximo(10.2f, 23.5f))
    println(Mayor.maximo(4.5, 5.2))
}