2012-11-05 5 views
9

Các thuộc tính trong groovy có vẻ như các trường lớp trong java mà không có một công cụ sửa đổi truy cập. Điều đó có đúng không? Hoặc họ có một ý nghĩa đặc biệt. Nó có vẻ như không có cách nào để làm cho các tài sản riêng tư?'Thuộc tính' trong Groovy là gì?

Trả lời

3

Thuộc tính thường có thể được xử lý như trường, nhưng chúng thực sự được hỗ trợ bởi getters/setters ngầm, do đó bạn vẫn có thể tham chiếu chúng như trường hoặc đặt giá trị bằng giá trị. Đằng sau hậu trường, họ đang sử dụng getters/setters (bạn có thể xác định lại nếu bạn quan tâm).

Trang này có chi tiết về tài sản/lĩnh vực và bổ truy cập (xem đặc biệt là "quy tắc bất động sản và lĩnh vực" mục): http://groovy.codehaus.org/Groovy+Beans

Nó cũng cho thấy rằng bạn có thể làm cho một tài sản tư nhân (lĩnh vực tư nhân được hỗ trợ bởi getters tin/setters), nhưng bạn phải rõ ràng trong việc xác định getters/setters.

+0

Hàng đợi chỉnh sửa cho câu hỏi này đã đầy, nhưng liên kết được cập nhật (hiện hành hơn) để giải thích các thuộc tính so với các trường có tại đây: http://groovy-lang.org/objectorientation.html#_fields_and_properties –

12

Khi định nghĩa lớp Groovy khai báo trường không có bộ sửa đổi truy nhập, thì cặp phương thức setter/getter công cộng và trường biến cá thể được tạo ra, còn được gọi là "thuộc tính" theo JavaBeans specification.

class A { 
    String property 

    /* 
     private String property 

     public void setProperty(String property) { ... } 
     public String getProperty() { ... } 
    */ 
} 

Nếu chúng tôi khai báo trường biến công khai, chúng tôi chỉ nhận trường công khai, không có cặp phương thức setter/getter.

class A { 
    public String field 

    /* 
     public String field 
    */ 
} 

Từ pov một khách hàng Groovy của, không có sự khác biệt giữa truy cập vào một tài sản Groovy và một lĩnh vực nào trong thời gian chạy

def a = new A() 
println a.field 
println a.property 

mặc dù a.field truy cập các instance variable trực tiếp và a.property thực sự gọi a.getProperty() (hoặc a.setProperty(...) khi gán một giá trị). Nhưng vì thuộc tính tuân thủ đặc tả JavaBeans, lớp có thể được sử dụng liền mạch trong các môi trường dựa trên Java.

Tôi không thấy nhiều ý nghĩa khi tạo "thuộc tính riêng tư". private hạn chế việc sử dụng một phương thức hoặc biến thể hiện/lớp đối với loại lớp lưu trữ. Nhưng có lẽ bạn đang đề cập đến việc tạo một biến cá thể trường riêng.