我有一个Kotlin数据类:
data class PaymentAccount(
val accountId: Int,
val accountNumber: String,
val title: String
)
这是我在Java中要做的:
创建一个抽象类:
public abstract class PaymentAccount {
protected int accountId;
protected String accountNumber;
protected String title;
public PaymentAccount(int accountId,
String accountNumber,
String title) {
this.accountId = accountId;
this.accountNumber = accountNumber;
this.title = title;
}
}
创建空对象并扩展抽象类:
public class NullPaymentAccount extends PaymentAccount {
public NullPaymentAccount() {
super(-1,
"Invalid account number",
"Invalid title");
}
}
创建一个真实的对象并扩展抽象类:
public class RealPaymentAccount extends PaymentAccount {
public RealPaymentAccount(int accountId,
String accountNumber,
String title) {
super(accountId,
accountNumber,
title);
}
}
如何在Kotlin中正确实现Null Object模式?有不止一种方法吗?如果是这样,什么是最简洁,最优雅的方式?
答案 0 :(得分:3)
虽然已经给出了很好的解决方案,但是如果您的默认值不是全部或全部,则可能不需要显式类来表示空状态。我认为为所有字段 提供默认值是空对象模式。
例如,您可以这样编写类:
data class PaymentAccount(
val accountId: Int = -1,
val accountNumber: String = "Invalid Account Number",
val title: String = "Invalid Title"
)
构造它们时:
PaymentAccount(1, "Acct2", "Checking") // Actual data
PaymentAccount() // Default values, therefore a "null" object.
唯一真正的问题是当您仅指定某些值时,但这可能是好的/合乎需要的:
PaymentAccount(1) // accountNumber and title have defaults
答案 1 :(得分:2)
在Kotlin中,只需较少的代码行,您就可以做到这一点:
interface Account {
val accountId: Int
val accountNumber: String
val title: String
}
object EmptyAccount : Account {
override val accountId: Int = 1
override val accountNumber: String = ""
override val title: String = ""
}
data class PaymentAccount(
override val accountId: Int,
override val accountNumber: String,
override val title: String): Account
请注意,我们也将EmptyAccount
单调设为效率。