¿Cuál es la diferencia entre properties y parameters en Kotlin?

Aquí hay un ejemplo simple de una class con algunos códigos (properties) dentro del paréntesis

class Person(firstName: String) { .... } 

Ahora aquí hay un ejemplo de una function con algún código (parameters) dentro del paréntesis

 fun double(x: Int) { ... } 

Sé que esta es una pregunta fundamental, pero estoy bastante confundido como principiante.

Pasas parameters a funciones y constructores, y las classs tienen properties .

El constructor de la class Person en su ejemplo tiene un único parámetro, y también lo hace la double function. En este caso, el parámetro firstName no es una propiedad.

Para convertirlo en una propiedad, debe declararlo así:

 class Person(firstName: String) { val firstName : String = firstName } 

Kotlin permite que esto sea más corto, lo que hace que el parámetro firstName sirva como una propiedad:

 class Person(val firstName: String) 

las properties y los parameters son diferentes piensa:

parameters : cuando declaramos cualquier function:

 fun sum(a: Int, b: Int): Int { return a + b } 

Función que tiene dos parameters Int con tipo de retorno Int:

Propiedades y campos:

Declarando properties

Las classs en Kotlin pueden tener properties. Estos pueden declararse como mutables, usando la palabra key var o de solo lectura usando la palabra key val .

 class Address { var name: String = ... var street: String = ... var city: String = ... var state: String? = ... var zip: String = ... } 

Para usar una propiedad, simplemente nos referimos a ella por su nombre, como si fuera un campo en Java:

 fun copyAddress(address: Address): Address { val result = Address() // there's no 'new' keyword in Kotlin result.name = address.name // accessors are called result.street = address.street // ... return result } 

La syntax completa para declarar una propiedad es:

 var <propertyName>[: <PropertyType>] [= <property_initializer>] [<getter>] [<setter>] 

Primero, su firstName también es un parámetro en lugar de una propiedad en la class Person .

 // v-- a parameter declanetworking on primary constructor class Person(firstName: String) 

puede acceder a un parámetro declarado en el constructor primario en el bloque de init o en la statement de propiedad / campo, por ejemplo:

 class Person(firstName: String){ val first:String init{ first=firstName } } class Person(firstName: String){ val first:String = firstName } class Person(firstName: String){ @JvmField val first:String = firstName } 

para hacer el primer firstName de una propiedad que pueda usando la palabra key val o var , por ejemplo:

 // v--- immutable property class Person(val firstName: String) // v--- mutable property class Person(var firstName: String) 

una propiedad Kotlin generará getter / setter (?) y un campo de respaldo (?) para el código byte de Java. Tome un ejemplo de una propiedad mutable al código de byte de Java de la siguiente manera:

 public final class Person{ private String firstName; // backing field // v--- parameter public Person(String firstName){ this.firstName = firstName; } //getter public final String getFirstName(){ return firstName; } //setter public final String setFirstName(String firstName){ this.firstName= firstName; } } 

un parámetro solo visible en el ámbito de la function / ámbito del constructor, excepto el parámetro declarado en el constructor primario.

Nota : un parámetro es inmutable como java effective-final variables / parameters, por lo que no puede reasignar ningún parámetro en Kotlin, por ejemplo:

 fun foo(bar:String){ bar = "baz" // ^--- compile error } 
  • Kotlin llama al método java con el argumento Clase <T>
  • Single.zip completando antes de Success
  • ¿Cómo las funciones de almacenamiento en la colección estática afectarán el sistema?
  • ¿Por qué no se puede escribir un parámetro en Kotlin que tenga otros límites si está limitado por otro parámetro de tipo?
  • ¿Cómo podemos usar la recarga automática?
  • ¿Cómo declarar variables en Android (Kotlin) usando el estilo del código de Google?
  • ¿Hay alguna forma de cargar las bibliotecas de time de ejecución además de ponerlas en src / main / jniLibs?
  • IllegalArgumentException: savedInstanceState especificado como no nulo es nulo
  • list de kotlin de queue
  • ¿Cómo combinar la list dentro de una list de un tipo, en una sola list inmutable?
  • La desconnection no funciona en la aplicación Spring Boot (no es compatible con el método POST)