2011-09-27 35 views
9

Play! framework generates getters and setters cho mỗi trường công khai của một lớp mô hình khi chạy.Được hưởng lợi từ các getters và setters đã tạo trong Play! khung

public class Product { 

    public String name; 
    public Integer price; 
} 

sẽ được chuyển thành

public class Product { 

    public String name; 
    public Integer price; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getPrice() { 
     return price; 
    } 

    public void setPrice(Integer price) { 
     this.price = price; 
    } 
} 

Tài liệu hướng dẫn giải thích thêm:

Sau đó, khi bạn muốn truy cập vào một tài sản mà bạn chỉ có thể viết:

product.name = "My product"; 
product.price = 58; 

Đó là dịch tại thời gian tải tới:

product.setName("My product"); 
product.setPrice(58); 

... và cảnh báo:

Bạn có thể không trực tiếp sử dụng phương thức getter và setter để truy cập các thuộc tính nếu bạn dựa vào thế hệ tự động. Các phương thức này được tạo tại thời gian chạy là . Vì vậy, nếu bạn tham khảo chúng trong mã bạn viết, trình biên dịch sẽ không tìm thấy các phương pháp và sẽ tạo ra lỗi.

Vì tôi không thể sử dụng các getters và setters này từ bên ngoài Play! dự án, tôi thấy không có lợi ích trong việc tạo ra chúng. Lợi ích so với các lĩnh vực công cộng, tái cấu trúc (đóng gói một trường và thay đổi người gọi) của tất cả các IDE hiện đại được đưa vào tài khoản là gì?

Trả lời

8

Câu trả lời ngắn: Đậu yêu cầu chúng.

Dài hơn: Đặc điểm kỹ thuật của hạt yêu cầu (trong số những thứ khác) getter/setter cho mỗi trường nội bộ. Tôi không chắc chắn 100%, nhưng tôi cho rằng cả hai mẫu Hibernate và Groovy đều mong đợi Java Beans (POJO Beans chứ không phải Java EE!), Do đó chúng sẽ yêu cầu getters/setters. Chơi chỉ giúp bạn tiết kiệm thời gian để làm điều đó, vì vậy bạn không phải lo lắng về mã đĩa nồi hơi (trừ khi bạn muốn xác định trình lấy/setter của riêng bạn vì một số lý do mà bạn có thể làm).

+0

+1 câu trả lời hay. Tôi đã mở rộng quan điểm về việc xác định những người định cư và getters của riêng bạn khi tôi nghĩ rằng đó là một điểm thực sự quan trọng. – Codemwnci

8

Lý do khác, mặc dù bạn không phải chỉ định người định cư và getters, bạn vẫn có thể!

Vì vậy, nếu bạn có (mỗi ví dụ của bạn)

product.name = "my product" 

Đó là tốt, và làm cho mã của bạn nhanh hơn và theo ý kiến ​​của tôi dễ dàng hơn để đọc. Tuy nhiên, có một lý do tốt cho người định cư và getters cho đóng gói. Nếu bạn muốn thêm một số logic khi product.name của bạn được thay đổi, bạn có thể chỉ định setter của riêng bạn, nhưng bạn không phải thay đổi mã ở trên, vì nó sẽ tiếp tục gọi setter đằng sau hậu trường.

Vì vậy, điều này mang đến cho bạn sự linh hoạt và sức mạnh của việc đóng gói tốt, nhưng sự gọn gàng và dễ đọc của truy cập trực tiếp.

Tôi nghĩ đây là điều tốt nhất của cả hai thế giới.

+0

Nhưng vì "thuộc tính" chỉ có sẵn trong cùng một Play! dự án tôi có thể dễ dàng sử dụng một refactoring từ IDE của tôi. – deamon

+0

có, nhưng sau đó bạn bị mất khả năng đọc. Trường hợp này thực sự giúp tôi tìm thấy, là trong các mẫu. – Codemwnci

0

Nếu bạn có phương thức getter/setter riêng, thì điều này sẽ không hoạt động vì không thể tạo phương thức getter/setter công khai có cùng tên. Vì vậy, nó sẽ thất bại trong thời gian chạy!

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