2013-03-06 25 views
5

Xem xét việc này lớp trường hợpnhanh chóng lớp trường hợp với các giá trị được thiết lập cho các thành viên của nó

case class sample(val s: String = { /*compiled code*/ }) 
{ 
    val name:String = { /*compiled code*/ } 
    val no:Int = { /*compiled code*/ } 
} 

tôi cần phải tạo thể hiện của lớp này với giá trị cụ thể sẽ hiển thị tên và không. Nhưng tôi không thể sử dụng một lớp khác mở rộng lớp này. Tôi phải vượt qua cùng một cá thể lớp.

Trả lời

1

Và thực hiện tham số nameno hàm tạo không phải là một tùy chọn?

case class Sample(s: String = { /*compiled code*/ }, 
        name: String = { /*compiled code*/ }, 
        no: Int = { /*compiled code*/ }) 

Tôi giả định rằng /* compiled code */ xác định giá trị mặc định của trường. Bạn có thể sử dụng mã như sau:

Sample()     // all default values 
Sample("some value for s") // default values for name and no 
Sample("s", "name", 123) // explicit values, no defaults 
+0

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 –

+0

@ pagoda_5b Thật vậy, cảm ơn. –

2

Bạn có nghĩa là ai đó đã đi đến những rắc rối của việc bảo đảm nameno đượ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ó.

+0

Tôi muốn gửi lại thể hiện của lớp này với các giá trị đã sửa đổi. – user2140033

+0

@ user2140033 - Bạn có thể không. Các giá trị là không thay đổi. Bạn không thể thay đổi chúng. Tôi không thể bắt đầu thể hiện nó khủng khiếp như thế nào nếu nó sẽ không thể thay đổi được nếu nó là tầm thường để thay đổi các giá trị được chỉ định là không bao giờ thay đổi. –