2013-06-21 18 views
6

Nó được thực nghiệm phát hiện ra rằng Scala phép đụng độ tên cho các biến đối tượng tư nhân và các phương pháp như dưới đây:tự mang tên trường và accessor trong Scala

class Test { 
    private[this] var x = 1 
    def x(): String = this.x.toString 
} 

Mã này có giá trị ít nhất là cho Scala 2.10 và tạo ra chính xác những gì tôi mong đợi (dịch ngược vào Java):

public class Test { 
    private int x; 

    public String x() { 
     return BoxesRunTime.boxToInteger(x).toString(); 
    } 

    public Test() { 
     x = 1; 
    } 
} 

vấn đề là tôi không chắc chắn nếu tôi có thể dựa vào hành vi này trong sau Scala phát hành bởi vì tôi đã không thể tìm thấy một bằng chứng có thẩm quyền trong các thông số kỹ thuật rằng đây hành vi là do thiết kế. Vì vậy, ai có thể gợi ý cho tôi một nguồn kiến ​​thức như vậy?

Cập nhật: Mục tiêu của tôi là sử dụng phương pháp này để ánh xạ mô hình dữ liệu Hibernate với các lớp Scala. Vì không có cách nào dễ dàng để cho phép Hibernate hỗ trợ các bộ sưu tập Scala, tôi muốn ánh xạ một bộ sưu tập Java trong một trường riêng mà sau đó được gói vào một bộ sưu tập Scala trong một phương thức accessor tự đặt tên. Yêu cầu quan trọng là giữ trường và phương thức có cùng tên vì tôi cũng muốn giữ lại tên bộ sưu tập hợp lý Hibernate, ví dụ: để tham khảo nó trong HQL.

+2

Tại sao không chỉ cần sử dụng một lớp trường hợp? Nó sẽ cung cấp cho bạn loại hành vi tương tự này và nếu bạn muốn thay đổi x, chỉ cần sử dụng chức năng sao chép được tích hợp sẵn. – cmbaxter

+2

Điều thú vị cần lưu ý là nếu bạn bỏ qua các mệnh lệnh từ 'def x()', nó không biên dịch –

Trả lời

3

những va chạm này hoàn toàn bình thường. Nhưng hãy nhớ rằng việc đọc mã của bạn có thể trở thành một vấn đề, vì những va chạm này sẽ xuất hiện (nếu bạn cần) chỉ dành cho getters/setters. Trong trường hợp khác xin vui lòng sử dụng tên phương pháp rõ ràng như:

def xAsString(): 

chủ đề này cũng có thể hữu ích scala discussion on name collisions

và điều này naming conventions by Daniel Spewaks

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