首页 > 解决方案 > 在 Kotlin 中何时使用参数与何时使用成员变量?

问题描述

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

请参见下面的示例:

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

标签: kotlin

解决方案


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

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


对于你的第二个问题,什么时候应该和不应该使用valor 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属性创建了一个同时具有 setter 和 getter 的属性,因此您可以对其进行更新。该val属性创建了一个只有 getter 的属性,因此您可以读取它。没有关键字的 arg 没有属性 - 相反,它被传递给构造函数供您根据需要使用。这是一个简单的示例,因此它什么都不做,但实际上您可以使用它来初始化其他属性或使用init块。


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

这是解释这一点的第一个谷歌点击: https ://medium.com/@mydogtom/tip-how-to-show-java-equivalent-for-kotlin-code-f7c81d76fa8

希望有帮助!


推荐阅读