2012-11-25 23 views

Trả lời

6

tôi đã biên soạn cả hai phiên bản của một lớp:

class PersonV0 { 
    var name : String = _ 
    var surname: String = _ 
} 

class PersonV1 (var name:String, var surname: String) 

Sự khác biệt là cấu trúc:

public experimental.PersonV0(); 
    Code: 
    0: aload_0 
    1: invokespecial #23; //Method java/lang/Object."<init>":()V 
    4: return 
} 

public experimental.PersonV1(java.lang.String, java.lang.String); 
    Code: 
    0: aload_0 
    1: aload_1 
    2: putfield #12; //Field name:Ljava/lang/String; 
    5: aload_0 
    6: aload_2 
    7: putfield #16; //Field surname:Ljava/lang/String; 
    10: aload_0 
    11: invokespecial #24; //Method java/lang/Object."<init>":()V 
    14: return 
} 
10

Sự khác biệt giữa hai là, trong trường hợp thứ hai, các trường cũng là các tham số cho hàm tạo. Nếu bạn khai báo các tham số là val hoặc var, chúng sẽ tự động trở thành thành viên công khai. Nếu bạn không có var/val ở đó và không sử dụng các biến ở bất kỳ đâu nhưng trong hàm tạo, chúng sẽ không trở thành thành viên, nếu bạn làm như vậy, chúng sẽ là thành viên riêng tư. Nếu bạn sẽ làm cho chúng case class es, bạn sẽ trong trường hợp đầu tiên không có unapply cho các biến.

Vì vậy, để trả lời câu hỏi của bạn: Trong trường hợp này bạn nói đúng, bạn chỉ cần thay đổi cách bạn đặt giá trị.

chỉnh sửa:

Mẹo: bạn có thể thấy, những gì trình biên dịch scala tạo ra, nếu bạn gọi trình biên dịch với -print, điều này cũng làm việc cho REPL.

Các vấn đề liên quan