Единственный вопрос, который вам нужно задать, это "Это то, что должно быть установлено через конструктор?"Если да, то используйте параметр.Если нет, используйте свойство.Добавляя var
, вы по-прежнему делаете объявление свойством, вы просто добавляете ярлык для его инициализации из конструктора.
Если вы исходите из фона Java, смотрите на Javaэквивалент будет полезно.Это будет примерно так:
public class BankAccount {
private final String mAccountCode;
private final String mAccountName;
private double mBalance;
public BankAccount(String accountCode, String accountName, double balance) {
mAccountCode = accountCode;
mAccountName = accountName;
mBalance = balance;
}
public BankAccount(String accountCode, String accountName) {
this(accountCode, accountName, 0.0d)
}
public void setBalance(double balance) {
mBalance = balance;
}
public double getBalance() {
return mBalance;
}
}
против
public class BankAccount {
private final String mAccountCode;
private final String mAccountName;
private double mBalance = 0.0d;
public BankAccount(String accountCode, String accountName) {
mAccountCode = accountCode;
mAccountName = accountName;
}
public void setBalance(double balance) {
mBalance = balance;
}
public double getBalance() {
return mBalance;
}
}
Обратите внимание, что вы получаете аргумент конструктора для поля баланса в первом случае.В любом случае вы можете обновить значение с помощью вызова метода для установщика.
Для вашего второго вопроса, когда вы должны и не должны использовать val
или var
, ответ будет "Используйте var, чтобы сделать параметр доступным для записи свойством, используйте val, чтобы сделать его доступным только для чтения, и ничего не используйте, если вам просто нужны аргументы конструктора.
Опять же, Java-эквивалент чего-то вроде этого:
open class Example(var writable : Int, val readable : Int, constructorArg : Int) {
// Could use constructor arg to init another property
private val someOtherProperty : Int = constructorArg
// Or in the init block (the Kotlin "constructor" body)
init {
// Or do something with constructArg in the constructor
}
}
Было бы примерно так:
public class Example {
private int mWritable;
private final int mReadable;
private final int mSomeOtherProperty;
public Example(int writable, int readable, int contructorArg) {
mWritable = writeable;
mReadable = readable;
// Could use constructor arg to init another property
mSometOtherProperty = constructorArg;
// Or do something with constructArg in the constructor
}
public int getWritable() {
return mWritable;
}
public void setWritable(int writable) {
mWritable = writable;
}
public int getReadable() {
return mReadable;
}
Атрибут var
создает свойство, которое имеет как установщик, так и получатель, поэтому вы можете обновить его. Атрибут val
делаетсвойство, которое имеет только геттер, так что вы можете его прочитать. Аргумент без ключевого слова не создает свойства - вместо этого он передается конструктору для использования по мере необходимости. Это простой пример, поэтому он ничего не делает, но на самом деле вы быиспользуйте его либо для инициализации других свойств, либо с блоком init
.
Опять же, если вы исходите из фона Java, вы можете использовать Intellij для запуска представления the Байт-код Kotlin, затем преобразуйте его в Java, чтобы увидеть, в чем заключаются различия в языке.
Вот первый хит Google, который объясняет это: https://medium.com/@mydogtom/tip-how-to-show-java-equivalent-for-kotlin-code-f7c81d76fa8
Надеюсь, что поможет!