是否有任何指标来决定使用参数还是成员变量?
请参见以下示例:
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
答案 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的方法调用来更新值。
对于第二个问题,当您应该或不应该使用val
或var
时,答案是“使用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
设为(可选)参数是有意义的。否则,成员变量更合适。