2015-03-19 15 views
5

Thông thường trong các lớp Java có nhiều phương thức getter và setter, mỗi phương thức cho mỗi biến lớp mô hình dữ liệu. Tôi nhận ra rằng nhiều IDE sẽ tạo ra chúng cho bạn, nhưng tôi đang cố gắng tránh sự lộn xộn này và không có tất cả các phương thức này trong các lớp của tôi. Vì vậy, có cách nào để truy cập một biến trong một thời trang chỉ đọc bên ngoài lớp (như thể nó là công khai cuối cùng), trong khi vẫn giữ quyền truy cập ghi bên trong lớp hoặc phân lớp độc quyền (như thể nó là riêng tư hoặc được bảo vệ).Trong Java, có một phương án thay thế tốt hơn cho các phương thức getter và setter không?

Giải pháp giả duy nhất mà tôi đã đưa ra là một lớp cơ sở (hoặc giao diện với các phương thức mặc định) có phương thức get (String variableName), sau đó lấy các trường của lớp thông qua sự phản chiếu và trả về một lớp thích hợp . Nhược điểm là để làm việc, các biến phải được công khai, vì vậy chỉ theo quy ước nó đáp ứng các yêu cầu của tôi (trong lớp mở rộng/triển khai có các biến tôi muốn truy cập, tôi chỉ gọi phương thức get từ bên ngoài lớp và không triển khai phương thức đã đặt). Điều chính tôi không thích về điều này là nếu một tên biến thay đổi, người gọi của các phương thức get sẽ không gây ra lỗi trình biên dịch, vì tên biến chỉ là một chuỗi mã cứng.

Bất kỳ ai có ý tưởng tốt hơn?

+7

Có. Tôi có một ý tưởng tốt hơn - * xin đừng làm điều này *. * Phản ánh * cực kỳ chậm. Và bằng cách không có setters/getters, bạn phá vỡ * đóng gói * cũng như * abstraction *. Và nếu bạn sử dụng các khung công tác như * Spring *, bạn sẽ cần những người định cư. – TheLostMind

+2

Bạn nên đọc một lần 'Hiệu quả java bởi Joshua Bloch'. – Prashant

+0

Nếu bạn muốn tránh lộn xộn thì không viết getters và setters trừ khi bạn thực sự cần chúng. –

Trả lời

0

Java FX giới thiệu một cái gì đó tương tự như những gì bạn muốn: ReadOnlyProperty

Có thể không được chính xác những gì bạn đang tìm kiếm, mặc dù. Nói chung, tôi không nghĩ rằng việc lộ một biến là một ý tưởng hay.

+0

Hoặc sử dụng các lớp thực hiện '' WritableValue'' như '' BooleanProperty'', '' LongProperty'', ...: http://docs.oracle.com/javafx/2/api/javafx/ beans/value/WritableValue.html – nrainer

4

Bạn có thể sử dụng lombok - để tránh phương pháp gettersetter theo cách thủ công. Nhưng nó tạo ra bởi chính nó.

Việc sử dụng lombok làm giảm đáng kể số lượng mã. Tôi thấy nó khá tốt và dễ sử dụng. Nhưng ở đây bạn có thể tìm thấy một số ưu và khuyết điểm của việc sử dụng lombokhere.

Hy vọng điều đó sẽ hữu ích.
Cảm ơn rất nhiều.

4

Có - cố gắng thiết kế các lớp học của bạn để bạn không có getters và setters cả. Thông thường đó là một thiết kế xấu để có getters và setters trên tất cả các lĩnh vực của bạn bởi vì nó phá vỡ đóng gói. Một ngoại lệ là trường hợp của Java Beans (nơi bạn có một lớp mô hình/DTO hoặc một số lớp được ánh xạ tới XML/JSON); ở đây bạn không nên nhớ họ vì người định cư và getters là phương pháp duy nhất.

Trong các lớp học có logic, hãy tiêm phụ thuộc của bạn thông qua hàm tạo hoặc trực tiếp nếu bạn sử dụng Spring/CDI và bạn thích nó. Điều này an toàn hơn vì bạn sẽ không có đối tượng ở trạng thái không nhất quán; ví dụ như bạn tạo một đối tượng nhưng quên gọi một setter -> NullPointerException. Nhưng bằng cách sử dụng các nhà thầu, bạn tránh trường hợp quên gọi những người định cư.

Tất nhiên có thể có trường hợp ngoại lệ, như khi thiết lập một số trường tùy chọn khi bạn không muốn tất cả các phụ thuộc trong hàm dựng luôn luôn. Tuy nhiên, điều này có thể được giải quyết với các nhà xây dựng quá tải hoặc nếu trường hợp phức tạp hơn thì vấn đề có thể được giải quyết một cách thanh lịch hơn bằng cách sử dụng mẫu trình xây dựng.

Xem bài viết tuyệt vời về điều này: http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

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