2015-04-24 19 views
10

Thông qua API Java, bạn thấy nhiều lần xảy ra xung đột việc đặt tên và thực hành gây nhầm lẫn cho tôi.Quy ước Java về dữ liệu có thể truy cập. (Public accessors & Getters/Naming)

Ví dụ:

Lớp String có một biến tư nhân (Integer) bằng tên của count mà theo dõi kích thước của chuỗi, tuy nhiên điều này sẽ được trả về bởi một getter bởi tên của length() .

Nếu bạn di chuyển sang bất kỳ loại mảng nào, thay vì có phương thức getter cho chiều dài, chúng chỉ truyền biến thông qua bộ truy cập công khai và có thể lấy thông qua arrayInstance.length.

Di chuyển trở lại lớp Chuỗi chúng tôi có phương thức String#getBytes() là phương thức getter, tương tự như getter length(), tuy nhiên thực hiện một chút logic để nhận và trả về giá trị.

Đối với tôi, cá nhân, tạo ra một getter với tiền tố của get dường như không cần thiết, ví dụ như tôi chứ không phải gõ GamePacket#data() so GamePacket#getData() tuy nhiên tôi có cảm giác như có thể có một ý nghĩa sâu xa đằng sau đặt tên này thay vì chỉ mâu thuẫn.

Ngoài ra, tại sao không Array[] sử dụng bộ nạp cho length?

Có ai đủ tử tế để làm sáng tỏ điều này cho tôi không?

+2

Một mảng sẽ không được kích thước lại. 'Length' là' final' và vô hại.' – ChiefTwoPencils

+0

@ChiefTwoPencils - Rất đáng lưu ý, bỏ qua điều đó, +1. – Hobbyist

Trả lời

6

Getters (và setters) đến từ Java Bean đặc điểm kỹ thuật. Những lý do để sử dụng chúng nhiều:

  • nhất các nhà phát triển Java mong đợi accessors được đặt tên như thế
  • một API tôn trọng những công ước là dễ dàng hơn để khám phá. Ví dụ: trong IDE của tôi, tôi thường sẽ nhấn getCtrlKhông gian để khám phá tất cả thông tin có sẵn trong một đối tượng.
  • nhiều API và khung công tác dựa trên các quy ước này để hoạt động: khuôn khổ JSP EL, MVC điền đậu từ tham số yêu cầu, JPA, khung tiêm phụ thuộc như Spring, v.v.

Bạn thường tên getter cách tương tự như biến tư nhân nắm giữ các thông tin, nhưng điều quan trọng là đóng gói và các API công cộng, vì vậy không có gì ngăn cản bạn từ máy tính một giá trị trong một getter, hoặc để tên trường tư nhân theo một cách khác.

+0

Tôi xin lỗi, có lẽ tôi không đọc câu trả lời của bạn đúng cách, do đó, nó là đúng quy ước để sử dụng 'getXXX()' apposed để 'XXX()' hay không nó thực sự không quan trọng? – Hobbyist

+0

Vâng, đó là một quy ước mà hầu hết các nhà phát triển đều tôn trọng, đặc biệt nếu có cơ hội cho lớp của họ được sử dụng trong một môi trường dựa trên các quy ước này. –

0

Quy ước đặt tên có vẻ khác nhau trong toàn bộ mã Java, nhưng một tiêu chuẩn ban đầu là quy ước đặt tên JavaBeans; điều này về cơ bản đã hình thành một giải pháp danh pháp để thiếu tính chất thực sự của Java.

Getters đối tượng/nguyên thủy có dạng getXXX(), ngoại trừ boolean, có dạng ưa thích làXXX(). Người định cư luôn ở dạng setXXX().

Từ điểm duy nhất này, hàng triệu dòng mã phản chiếu được viết.

chú thích

ước này trước ngày tháng, mà sẽ là một sự đánh đổi giữa tăng ý định và tăng tính cách rườm rà khi viết một cái gì đó như mã giả ish này

@Setter 
void data(Data data) { 
    this.data = data; 
}; 

@Getter 
Data data() { 
    return data; 
}; 
1

Đây không phải là câu trả lời đầy đủ, vì câu trả lời thực có thể yêu cầu phỏng vấn các nhà phát triển Java ban đầu hoặc bằng cách khác nghiên cứu hồ sơ lịch sử. Nhưng dưới đây là một vài lưu ý:

  • Như bạn đã nói trong các ý kiến, các length lĩnh vực của một mảng là final, do đó nó không thể được thiết lập.
  • Cả hai mảng và lớp String được thiết kế trong các phiên bản sớm nhất của Java, trước khi các quy ước về getters và setters được giải quyết. Các quy ước get...is...set... chỉ thực sự được giải quyết khi giới thiệu JavaBeans. Thay đổi API sẽ làm cho mã cũ ngừng hoạt động và do đó tên cũ vẫn tồn tại.
  • Nói chung (ví dụ: các lớp không phải là JavaBeans), thực tế không có quy tắc nào nói rằng các phương thức getter và setter phải phản ánh tên của bất kỳ trường cụ thể nào trong lớp. Toàn bộ ý tưởng của các phương thức accessor là chúng ẩn thực hiện, vì vậy bất cứ thứ gì phía sau chúng đều có thể là một trường, một sự kết hợp các trường, hoặc một cái gì đó hoàn toàn khác.
Các vấn đề liên quan