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條經驗 獲得超5個贊
您可以在伴隨對象上添加應用:
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)
}
}
添加回答
舉報