Quy ước đặt tên: Trường cuối cùng (không tĩnh)


23

Hôm nay tôi đã thảo luận với một đồng nghiệp về việc đặt tên các finaltrường trong các lớp Java.

Trong các finaltrường phái của anh ta cũng nên được coi là hằng số vì giá trị của chúng sẽ không thay đổi sau khi tạo ra thể hiện.

Điều này sẽ dẫn đến quy ước đặt tên sau đây cho finalcác trường:

public class Foo {
    private static final String BLA_BLA = "bla";

    private final String BAR_BATZ;

    ...
}

Theo tôi, chỉ static finalcác trường nên được coi là hằng số trong khi các trường chỉ finalnên tuân theo quy ước đặt tên camelCase thông thường.

public class Foo {
    private static final String BLA = "bla";

    private final String barBatz;

    ...
}

Bây giờ tôi có một chút không chắc chắn vì anh ta là một lập trình viên giàu kinh nghiệm hơn tôi và tôi thường đồng ý với ý kiến ​​của anh ta và coi anh ta là một nhà phát triển rất giỏi.

Bất kỳ đầu vào trên này?


Ví dụ của bạn không phải là hằng số; bạn đã không gán bất kỳ giá trị nào cho chúng tại thời điểm biên dịch. Ergo, họ không tuân theo các quy ước đặt tên cho các hằng số.
Robert Harvey

@RobertHarvey Cảm ơn, bạn đã đúng. Điều ...này có nghĩa là tượng trưng cho bất kỳ nhà xây dựng có thể nào đặt finaltrường, nhưng rõ ràng điều đó là không thể đối với static finaltrường.
Sói Sascha

1
@Zeeker bạn có thể quan tâm đến các static { }khối có thể được sử dụng để đặt các trường tĩnh trong một lớp khi lớp được tải. Liên quan Làm việc với hàm tạo tĩnh trong Java .

@RobertHarvey Tôi quen thuộc với những người đó. Nhưng dù sao cũng cảm ơn.
Sói Sascha

1
Tôi sẽ nói rằng vì biến thuộc về một thể hiện, nên nó sẽ khác với thể hiện, vì vậy nó không áp dụng như một hằng số. Tôi sẽ sử dụng trường hợp lạc đà.
Florian F

Câu trả lời:


20

Sun (và bây giờ là Oracle) đã duy trì một tài liệu có tiêu đề Quy ước mã cho ngôn ngữ lập trình Java . Bản cập nhật cuối cùng cho bản này là vào năm 99, nhưng bản chất của dòng hướng dẫn phong cách vẫn tồn tại.

Chương 9 bao gồm các quy ước đặt tên.

Đối với loại định danh 'hằng số':

Tên của các biến được khai báo là hằng lớp và của hằng ANSI phải là chữ hoa với các từ được phân tách bằng dấu gạch dưới ("_"). (Nên tránh các hằng ANSI, để dễ gỡ lỗi.)

Các ví dụ đã cho:

static final int MIN_WIDTH = 4;

static final int MAX_WIDTH = 999;

static final int GET_THE_CPU = 1;

Trong một tài liệu gần đây hơn - nó bị trượt ở đó. Từ các biến (Hướng dẫn Java> Học ngôn ngữ Java> Khái niệm cơ bản về ngôn ngữ :

Nếu tên bạn chọn chỉ bao gồm một từ, hãy đánh vần từ đó trong tất cả các chữ cái viết thường. Nếu nó bao gồm nhiều hơn một từ, viết hoa chữ cái đầu tiên của mỗi từ tiếp theo. Tên gearRatiocurrentGearlà ví dụ điển hình của quy ước này. Nếu biến của bạn lưu trữ một giá trị không đổi, chẳng hạn như static final int NUM_GEARS = 6, quy ước sẽ thay đổi một chút, viết hoa mỗi chữ cái và tách các từ tiếp theo bằng ký tự gạch dưới. Theo quy ước, ký tự gạch dưới không bao giờ được sử dụng ở nơi khác.

Nhiều máy phân tích tĩnh cho Java tìm cách thực thi điều này. Ví dụ checkstyle thực thi:

Kiểm tra xem các tên hằng tuân theo một định dạng được chỉ định bởi thuộc tính định dạng. Hằng số là trường tĩnh và cuối cùng hoặc trường giao diện / chú thích, ngoại trừ serialVersionUIDserialPersistentFields. Các định dạng là một biểu thức thông thường và mặc định ^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$.


Điều này thực sự nắm bắt được các quy ước của cộng đồng viết mã ... và lý tưởng là giữ nguyên như vậy.

Các ví dụ ở trên được đưa ra dưới dạng các ví dụ static finalcó khả năng xuất phát từ các quy ước C cho #define- giống như C, được thay thế trong mã trong quá trình biên dịch thay vì trong thời gian chạy.

Câu hỏi mà sau đó nên được đặt ra là "đây có phải là hành vi như một hằng số không? Hay nó hoạt động giống như một trường viết một lần?" - và sau đó tuân theo các quy ước cho phù hợp. Bài kiểm tra litmus cho một câu hỏi như vậy sẽ là "Nếu bạn định tuần tự hóa đối tượng, bạn có bao gồm trường cuối cùng không?" Nếu câu trả lời là nó là một hằng số thì hãy coi nó như vậy (và không tuần tự hóa nó). Mặt khác, nếu nó là một phần của trạng thái của đối tượng cần được tuần tự hóa, thì đó không phải là một hằng số.

Dù thế nào đi nữa, điều quan trọng là phải gắn bó với kiểu mã dù đúng hay sai. Các vấn đề tồi tệ hơn nổ ra từ các quy ước không nhất quán trong một dự án hơn là chỉ một cái gì đó xúc phạm đến mắt. Xem xét nhận được một số công cụ phân tích tĩnh và cấu hình chúng để duy trì tính nhất quán.



@RobertHarvey Tôi có thể hình dung một số tình huống trong đó một trường thể hiện đang hoạt động như một hằng số. Chẳng hạn, một Nhà máy, tạo ra thứ gì đó có thể là một hằng số trong đối tượng ... mặc dù những thứ này lấy những ví dụ khá giả tạo làm tôi đau đầu khi nghĩ về lý do tại sao một người sẽ làm điều đó.

Cảm ơn câu trả lời chi tiết này. Các thử nghiệm litmus về việc tuần tự hóa đối tượng đã thực hiện thỏa thuận cho tôi.
Sói Sascha

Một đồng nghiệp đã đưa ra quan điểm hợp lệ gần đây khi nói rằng, ngày xưa, các biên tập viên không giỏi trong việc làm nổi bật trận chung kết tĩnh / tĩnh, v.v., vì vậy quy ước đặt tên này rất quan trọng. Ngày nay, IDE khá tốt, vì vậy chúng ta có thể tạo ra những cái tên đẹp hơn cho chúng, ví dụ: MinWidththay vì MIN_WIDTH. Một câu hỏi khác là: những gì về loggers tĩnh cuối cùng? Bạn có gọi họ LOG/ LOGGERhoặc log/ logger. Cá nhân, có logvẻ tốt hơn nội tuyến với mã, nhưng khi nào thì sự không nhất quán được chấp nhận, nếu có?
ndtreviv

5

BAR_BATZkhông phải là một hằng số trong ví dụ này. Các constructor của Foocó thể đặt nó thành các giá trị khác nhau ở cấp đối tượng. Ví dụ

public class Foo {
    private final String BAR_BATZ;

    Foo() {
       BAR_BATZ = "ascending";
    } 

    Foo(String barBatz) {
       BAR_BATZ = barBatz;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.