2012-10-19 44 views
6

Tôi có thể chuyển đối số cho hàm tạo lớp Scala không được lưu trữ trong lớp không? Tôi muốn đạt được chức năng trong Java có thể được viết như sau:Trình xây dựng lớp Scala các tham số cục bộ

class A { 
    private final SomethingElse y; 
    public A(Something x) { 
      y = x.derive(this); 
    } 
} 

I.e. class constructor nhận tham số sau đó được chuyển thành giá trị khác bằng cách sử dụng tham chiếu đến this. Tham số bị quên sau khi hàm tạo trả về.

Trong Scala tôi có thể làm:

class A(x: Something) { 
    val y = x.derive(this) 
} 

Nhưng nó có nghĩa là x được lưu trữ trong các lớp học, mà tôi muốn tránh. Vì phương thức x.derive sử dụng tham chiếu đến this, tôi không thể thực hiện phép chuyển đổi trong đối tượng đồng hành.

Trả lời

7

Nhưng điều đó có nghĩa là x được lưu trữ trong lớp mà tôi muốn tránh.

Nếu bạn không tham chiếu đối số hàm tạo ở bất kỳ đâu ngoại trừ chính hàm tạo, trường sẽ không được tạo. Nếu bạn tham chiếu x, ví dụ: trong toString(), Scala sẽ tự động tạo và gán cho riêng bạn val cho bạn.

Sử dụng javap -c -private A để xác minh loại trường nào được tạo thực sự.

BTW bạn vượt qua this bên trong một hàm tạo, có nghĩa là lấy tham chiếu đến thể hiện không được khởi tạo là A. Hãy cẩn thận!

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