2009-10-10 35 views
11

Tôi đang viết hàm equals(Object obj) cho một lớp. Tôi thấy rằng có thể truy cập vào các trường riêng tư của obj từ người gọi. Vì vậy, thay vì sử dụng một getter:Java: Truy cập các trường riêng tư trực tiếp từ một cá thể khác của cùng một lớp

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

Tôi chỉ có thể truy cập vào các lĩnh vực trực tiếp:

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

là xấu thực hành này?

+1

Có thể không phải là bản sao chính xác nhưng rất gần: http://stackoverflow.com/questions/1540159/using-getters-or -using-direct-field-access-within-a-pojo – ChssPly76

Trả lời

6

Không, không phải. Lý do mà các biến và phương thức riêng không thể truy cập từ các lớp khác là cho phép bạn thay đổi nội bộ của lớp mà không phải thay đổi tất cả mã sử dụng lớp đó và ngăn chặn người dùng lớp của bạn chẳng hạn như thiết lập biến với một giá trị mà nó không bao giờ phải có).

Nếu bạn sử dụng các biến riêng tư của các đối tượng khác không làm hại bất cứ điều gì, bởi vì nếu bạn muốn cấu trúc lại nội bộ của lớp, bạn phải thay đổi mã bên trong lớp.

+1

Chỉ vì nó sẽ làm việc 99% thời gian không có nghĩa là đó là điều đúng để làm. Nó phá vỡ đóng gói và các cặp vợ chồng các lớp học chặt chẽ hơn không có lý do khác hơn là tiết kiệm gõ năm ký tự. Xin vui lòng xem câu trả lời của tôi. –

+3

"các cặp vợ chồng các lớp học chặt chẽ hơn với nhau" - lớp học nào? Chỉ có một lớp học có liên quan ở đây, và bạn không thể "tách rời" một lớp học. – sepp2k

+1

Không nhất thiết. Tham số được chuyển tới equals() không nhất thiết phải là cùng một lớp. –

9

Tôi có xu hướng luôn sử dụng getters, bởi vì đôi khi một getter không chỉ là "return (foo)". Đôi khi chúng khởi tạo mọi thứ nếu chúng không có hoặc có một số lỗi khi đăng nhập chúng hoặc xác nhận trạng thái hiện tại theo một cách nào đó. Nó phù hợp hơn.

+0

+1 Nếu vì lý do gì "bộ sưu tập" có thể được đổi amed để rõ ràng hơn nhà nước đó là mục đích, tôi thà thay đổi nó ở một nơi thay vì mỗi nơi getter sẽ được sử dụng. –

1

Điều đó là tốt và hoàn toàn bình thường. Đó là một chút kỳ lạ khi nghĩ rằng this có thể fiddle với các lĩnh vực tư nhân của other, nhưng nó không sao vì không có cách nào xấu có thể xảy ra như xa như một số bên thứ ba có thể muck với một nội bộ của đối tượng Odp. Bất kỳ phương thức nào của lớp Odp đều có thể sửa đổi bất kỳ thành viên riêng tư nào của bất kỳ đối tượng Odp nào, thậm chí không phải là this đối tượng.

5

Tôi không nghĩ rằng đây là hành vi xấu, nhưng là một tính năng của ngôn ngữ. Nó không chỉ cho phép bạn kiểm tra equals theo cách bạn làm, nhưng nó cũng hữu ích trong một mẫu Prototype để tạo đối tượng.

0

Sử dụng thành viên riêng tư cho lớp thực thể có thể khiến lớp proxy hoạt động không chính xác. Hãy tưởng tượng hibernate tạo lớp bằng cách truy vấn lười biếng. Nếu bạn kiểm tra biến thành viên, nó trả về null. Nhưng nếu bạn gọi get(), nó sẽ lấy dữ liệu từ cơ sở dữ liệu và khởi tạo trường.

1

Đây là một sự trùng lặp của

Why can I access my private variables of the "other" object directly, in my equals(Object o) method

tin dữ liệu được truy cập bởi bất kỳ trường hợp của lớp đó, ngay cả khi một instance của lớp A được truy cập vào các thành viên cá nhân của người khác thể hiện của A. Điều quan trọng là hãy nhớ rằng các công cụ sửa đổi truy cập (riêng tư, được bảo vệ, công khai) đang kiểm soát quyền truy cập lớp, không truy cập cá thể

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