Когда использовать параметр против, когда использовать переменную-член в Kotlin? - PullRequest
0 голосов
/ 27 января 2019

Есть ли индикаторы, чтобы решить, использовать ли параметр или переменную-член?

См. Пример ниже:

open class BankAccount(val accountCode: String, val accountName: String, 
var balance : Double = 0.0) {}

против

open class BankAccount(val accountCode: String, val accountName: String) {}
var balance : Double = 0.0

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Единственный вопрос, который вам нужно задать, это "Это то, что должно быть установлено через конструктор?"Если да, то используйте параметр.Если нет, используйте свойство.Добавляя 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

Надеюсь, что поможет!

0 голосов
/ 27 января 2019

TLDR: используйте параметр, если вам нужно параметризировать.


В первом случае вы сможете открыть счет с ненулевым балансом.

Если этот сценарий вы считаете полезным, имеет смысл сделать balance (необязательным) параметром. В противном случае переменная-член является более подходящей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...