kotlin - 在 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
解决方案
您唯一要问的问题是“这应该通过构造函数设置吗?” 如果是,则使用参数。如果没有,请使用属性。通过添加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 的方法调用来更新值。
对于你的第二个问题,什么时候应该和不应该使用val
or 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
希望有帮助!
推荐阅读
- ruby-on-rails - Rails 6 Capistrano 部署失败,即使应用程序在手动启动时工作正常
- python - 将得分值映射到范围 [0,255] 的像素
- r - RMarkdown 中的两列增量投影仪幻灯片
- single-sign-on - ADFS 4.0 与 IWA for Win2019
- c++ - 自定义向量类的构造函数,将额外的垃圾值分配给指针
- java - 单例类不同步行为
- javascript - 动态访问数组内对象内的数组
- hyperledger-fabric - 无法使用新的管理员身份更新结构通道配置
- maven - 为什么documents4j使用maven运行测试会出现错误
- c++ - 使用 C++ 访问字符串的每个单词