4 回答
TA贡献1844条经验 获得超8个赞
这样做是可能的,但这是代码异味。假设有人创建了您的钱包实例。他们必须generateKeys在您的课程真正可用之前打电话。如果他们忘记并尝试使用密钥,他们将收到运行时错误或无意义的行为。相反,将它们设置在主构造函数(如Josh 建议的那样)或工厂/应用方法(如Andy 建议的那样)中。
如果你还是想做
如果你真的想要一个已声明但未初始化的字段......你不能,确切地说,甚至在 Java 中也不能。在 Java 中,未初始化的字段被隐式初始化为默认值(null对于对象)。在 Scala 中,您可以通过为其分配下划线 ( _) 来获得此行为:
var publicKey: PublicKey = _
var privateKey: PrivateKey = _
这些将被初始化为空。不过,请不要这样做。
您的代码的其他问题
在 Scala 中,您应该更
val
喜欢var
.您的所有变量都是公开的。我猜你至少打算
balance
保密,因为你也有一个getBalance
方法。您的
Person
示例不遵循惯用风格,因为您可以将其写为class Person(var personName: String)
.
TA贡献1863条经验 获得超2个赞
摆脱def this() { ... }. 在 scala 中,构造函数体只是类声明之后的代码行。像这样:
class Person(name: String) {
private val id: String = name
// ... other fields, methods, etc.
}
TA贡献1797条经验 获得超6个赞
如果您需要在创建对象时未初始化的值,最好将它们设为Option值:
class Wallet {
private var publicKey: Option[PublicKey] = None
private var privateKey: Option[PrivateKey] = None
private var balance: Int = 0
def generateKeys(): Unit = {
val keyPair = KeyPairGenerator.getInstance("SHA-256").generateKeyPair()
privateKey = Some(keyPair.getPrivate)
publicKey = Some(keyPair.getPublic)
}
def getBalance = balance
}
这比使用更安全,null因为类型系统和运行时会在您使用它时检查该值是否有效。
但其他答案是正确的,如果可能的话,最好推迟创建这个对象,直到密钥可用。
TA贡献1821条经验 获得超4个赞
您可以在伴随对象上添加应用:
class Wallet private (val privateKey: PrivateKey, publicKey: PublicKey, balance: Int) {
def getBalance(): Int = balance
}
object Wallet {
def apply(): Wallet = {
val keyPair = KeyPairGenerator.getInstance("SHA-256").generateKeyPair()
val privateKey = keyPair.getPrivate
val privateKey = keyPair.getPublic
new Wallet(privateKey, privateKey, 0)
}
}
添加回答
举报