Bạn có nghĩa là ai đó đã đi đến những rắc rối của việc bảo đảm name
và no
được thiết lập một cách đặc biệt và không thể thay đổi, và bạn muốn làm cho họ chứa cái gì khác, mà có thể vi phạm tất cả các loại giả định? Đó không phải là một ý tưởng tốt, và JVM sẽ ngăn cản bạn làm điều gì đó ngu ngốc như vậy (chặn các thủ thuật vô lý khó khăn liên quan đến các trình nạp lớp tùy chỉnh cho mọi thứ).
Nếu bạn chỉ có nghĩa là bạn muốn đặt các vals đó, nhưng thường không phải lo lắng về chúng trong hàm tạo, thì có nhiều giải pháp khác nhau. Một là sử dụng Vals lười biếng và vars riêng với setters:
case class C(val s: String = "fish") {
private var myN: Option[Int] = None
def initializeN(n0: Int) {
myN = Some(n0)
if (n != n0) throw new Exception("Already initialized")
}
lazy val n: Int = myN.getOrElse(s.length) // s.length is your code block
}
Những hoạt động như vậy:
scala> C("salmon")
res0: C = C(salmon)
scala> res0.initializeN(2); res0.n
res1: Int = 2
scala> C("herring")
res1: C = C(herring)
scala> res1.n
res2: Int = 5
scala> res1.initializeN(2)
java.lang.Exception: Already initialized
at C.initializeN(<console>:11)
...
Có nhiều thủ thuật khác mà bạn có thể chơi nếu bạn muốn thời gian biên dịch an toàn của khởi tạo. Sau đó khối tham số có thể tham khảo những người trước đó, và không xuất hiện như các đối số trận đấu:
case class D(val s: String = "fish")(val n: Int = s.length) {}
Bạn có thể quá tải nhà xây dựng:
case class E(val s: String, n: Int) {
def this(s: String) = this(s, s.length)
def this() = this("fish")
}
và hỗn hợp khác nhau của các bên trên có thể xảy ra cũng có.
Nguồn
2013-03-06 13:30:08
Tôi nghĩ không, vì có vẻ như mã của bên thứ ba được biên dịch từ jar với IntelliJ IDEA –
@ pagoda_5b Thật vậy, cảm ơn. –