JavaRush /Blog Java /Random-VI /các phương thức và lớp Java cuối cùng
articles
Mức độ

các phương thức và lớp Java cuối cùng

Xuất bản trong nhóm
Bằng cách biểu thị một phương thức lớp bằng một công cụ sửa đổi final, chúng tôi muốn nói rằng không có lớp dẫn xuất nào có thể ghi đè phương thức này bằng cách thay đổi cách triển khai bên trong của nó. Nói cách khác, chúng ta đang nói về phiên bản cuối cùng của phương pháp. Toàn bộ lớp cũng có thể được đánh dấu là final. các phương thức và lớp Java cuối cùng - 1
final class NoExtending {
// …
}
Một lớp được đánh dấu là finalkhông thể kế thừa và tất cả các phương thức của nó đều gián tiếp có được thuộc tính đó final. Việc sử dụng tính năng a finaltrong khai báo lớp và phương thức có thể tăng mức độ bảo mật mã. Nếu một lớp được trang bị một công cụ sửa đổi finalthì không ai có thể mở rộng lớp đó và có thể phá vỡ hợp đồng của nó trong quá trình này. Nếu một dấu hiệu finalbiểu thị một phương thức, bạn hoàn toàn có thể tin tưởng vào việc triển khai nội bộ của nó trong mọi tình huống mà không sợ "giả mạo". Ví dụ, nó thích hợp để sử dụng finaltrong việc khai báo một phương thức yêu cầu xác minh mật khẩu do người dùng nhập để đảm bảo rằng việc thực thi chính xác những gì phương thức đó dự định ban đầu. Kẻ tấn công có thể sẽ không thể thay đổi cách triển khai ban đầu của một phương thức như vậy bằng cách “đưa” vào chương trình một phiên bản bị ghi đè của nó, chẳng hạn, phiên bản này luôn trả về giá trị đúng, cho biết người dùng đã đăng ký thành công, bất kể mật khẩu là gì. anh ấy thực sự đã bước vào. Bạn có quyền, nếu tình huống cụ thể cho phép, đi xa hơn và tuyên bố finaltoàn bộ lớp là một lớp; phương pháp này ValidatePasswordsẽ có được cùng một thuộc tính một cách gián tiếp. Việc sử dụng từ bổ nghĩa finaltrong khai báo phương thức hoặc lớp đặt ra những hạn chế nghiêm trọng đối với khả năng sử dụng và phát triển mã tiếp theo. Việc sử dụng finalmột phương thức trong một khai báo là một dấu hiệu chắc chắn rằng việc triển khai phương thức đó là khép kín và hoàn chỉnh. Các lập trình viên khác muốn sử dụng lớp của bạn, mở rộng các chức năng của nó để phù hợp với nhu cầu của họ, sẽ bị hạn chế trong việc lựa chọn các phương tiện để đạt được mục tiêu của họ hoặc hoàn toàn bị tước đoạt chúng. Bằng cách đánh dấu finaltoàn bộ một lớp, bạn sẽ vô hiệu hóa khả năng kế thừa của nó và có thể sẽ làm giảm đáng kể tính hữu dụng của nó đối với những người khác. Khi bạn chuẩn bị sử dụng từ bổ nghĩa final, hãy đảm bảo rằng BẠN đã sẵn sàng cho những hy sinh như vậy hay chưa và liệu điều đó có đáng để thực hiện hay không. Trong nhiều trường hợp, để đạt được mức độ bảo mật mã đủ, không cần thiết phải chỉ định toàn bộ lớp final- hoàn toàn có thể duy trì khả năng mở rộng của lớp bằng cách finalchỉ đánh dấu các thành phần cấu trúc "quan trọng" của nó bằng một công cụ sửa đổi. Trong trường hợp này, bạn sẽ giữ nguyên các chức năng chính của lớp, đồng thời cho phép kế thừa nó bằng cách bổ sung các thành viên mới, nhưng không định nghĩa lại các chức năng “cũ”. Tất nhiên, các trường được truy cập bằng mã của các phương thức finalphải lần lượt được chỉ định là , vì nếu không finalthì privatebất kỳ lớp dẫn xuất nào cũng có thể thay đổi nội dung của chúng, ảnh hưởng đến hành vi của các phương thức tương ứng. Một tác dụng khác của việc sử dụng công cụ sửa đổi finalcó liên quan đến việc đơn giản hóa vấn đề tối ưu hóa mã được trình biên dịch giải quyết. Đây là điều xảy ra khi một phương thức không được đánh dấu là được gọifinal, hệ thống thời gian chạy sẽ xác định lớp thực tế của đối tượng, liên kết lệnh gọi với mã thích hợp nhất từ ​​nhóm các phương thức bị quá tải và chuyển quyền điều khiển sang mã đó. Nhưng, ví dụ, nếu phương thức getNametrong ví dụ về lớp Attrđược thảo luận trước đó được chỉ định là final, thì hoạt động gọi nó có thể đã được đơn giản hóa đáng kể. Trong trường hợp tầm thường nhất, chẳng hạn như trường hợp liên quan getName, trình biên dịch có thể chỉ cần thay thế lệnh gọi phương thức bằng mã nội dung của nó. Cơ chế này được gọi là nội tuyến mã. Khi sử dụng phiên bản nội tuyến của phương thức, getNamehai biểu thức sau được thực thi giống hệt nhau:
system.out.println("id = " + rose.name);
system.out.println("id = " + rose.getName());
Mặc dù các biểu thức trên là tương đương, nhưng biểu thức thứ hai vẫn có một lợi thế, vì phương thức này getNamecho phép bạn đặt thuộc tính chỉ đọc cho trường tên và mã lớp có mức độ trừu tượng nhất định, cho phép bạn tự do thay đổi việc thực hiện lớp học. Trình biên dịch có thể áp dụng sơ đồ tối ưu hóa tương tự cho các phương thức privateand statiс, vì chúng cũng không cho phép ghi đè. Việc sử dụng công cụ sửa đổi finaltrong khai báo lớp cũng làm cho một số thao tác kiểm tra kiểu hiệu quả hơn. Trong trường hợp này, nhiều thao tác như vậy có thể được thực hiện ở giai đoạn biên dịch và do đó các lỗi tiềm ẩn được phát hiện sớm hơn nhiều. Nếu trình biên dịch gặp một tham chiếu đến một lớp trong văn bản nguồn final, thì có thể "chắc chắn" rằng đối tượng tương ứng thuộc loại được chỉ định. Trình biên dịch có thể xác định ngay vị trí của một lớp trong hệ thống phân cấp tổng thể của lớp và kiểm tra xem nó có được sử dụng đúng hay không. Nếu công cụ sửa đổi finalkhông được áp dụng, các kiểm tra tương ứng chỉ được thực hiện ở giai đoạn thực hiện chương trình. Bài tập 3.4. Có nên đưa công cụ sửa đổi cuối cùng vào khai báo phương thức (và nếu có thì phương thức nào) của các lớp phương tiện và phương tiện chở khách không ? Liên kết đến nguồn ban đầu: http://src-code.net/metody-i-klassy-final-java
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION