什么时候使用参数与何时使用Kotlin中的成员变量?

时间:2019-01-27 04:53:22

标签: kotlin

是否有任何指标来决定使用参数还是成员变量?

请参见以下示例:

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

vs。

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

2 个答案:

答案 0 :(得分:4)

您唯一要问的问题是“这是否应该通过构造函数设置?”如果是,则使用参数。如果没有,请使用属性。通过添加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;
    }
}

vs。

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;
    }
}

请注意,在第一种情况下,您将获得balance字段的构造函数参数。无论哪种情况,都可以通过对setter的方法调用来更新值。


对于第二个问题,当您应该或不应该使用valvar时,答案是“使用var将参数设置为可写属性,使用val将其设置为可读-只有属性,如果只需要构造函数args,则什么也不用。

同样,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属性构成的属性仅具有吸气剂,因此您可以读取它。 没有关键字的arg没有任何属性-而是将其传递给构造函数供您根据需要使用。这是一个简单的示例,因此它什么也不做,但实际上,您可以使用它来初始化其他属性或使用init块。


同样,假设您来自Java背景,您可以使用Intellij来运行以查看Kotlin字节码,然后将其转换为Java以查看该语言的不同之处。

这是第一个解释此问题的Google匹配: https://medium.com/@mydogtom/tip-how-to-show-java-equivalent-for-kotlin-code-f7c81d76fa8

希望有帮助!

答案 1 :(得分:0)

TLDR:如果需要参数化,请使用参数。


在第一种情况下,您将可以用一个非零的余额来启动一个帐户。

如果您觉得这种情况有用,那么将balance设为(可选)参数是有意义的。否则,成员变量更合适。