JavaRush /Blog Java /Random-VI /Nghỉ giải lao #134. Những điều cần tránh khi viết mã Java...

Nghỉ giải lao #134. Những điều cần tránh khi viết mã Java. Cách sử dụng cuối cùng, cuối cùng và hoàn thiện trong Java

Xuất bản trong nhóm

Những điều cần tránh khi viết mã Java

Nguồn: Medium Chúng tôi xin gửi đến bạn một bài viết liệt kê các lỗi phổ biến mà các nhà phát triển mắc phải khi viết mã Java. Nghỉ giải lao #134.  Những điều cần tránh khi viết mã Java.  Cách sử dụng cuối cùng, cuối cùng và hoàn thiện trong Java - 1

Sử dụng Enum.values

Việc đây được coi là một lỗi khiến tôi rất ngạc nhiên vì tôi sử dụng Enum.values ​​​​thường xuyên . Vấn đề ở đây là Enum.values() được coi là một danh sách bất biến theo thông số kỹ thuật. Để làm điều này, nó phải trả về một thể hiện mới của mảng với các giá trị enum mỗi lần nó được gọi.
public enum Fruits {
    APPLE, PEAR, ORANGE, BANANA;

    public static void main(String[] args) {
        System.out.println(Fruits.values());
        System.out.println(Fruits.values());
    }
}
// output
// [Lcom.test.Fruits;@7ad041f3
// [Lcom.test.Fruits;@251a69d7
Có hai đối tượng riêng biệt trong bộ nhớ ở đây nên có vẻ như đó không phải là vấn đề lớn. Nhưng nếu bạn sử dụng Fruit.values() khi xử lý một yêu cầu và bạn có tải cao thì điều này có thể dẫn đến các vấn đề về bộ nhớ. Bạn có thể dễ dàng khắc phục điều này bằng cách giới thiệu biến cuối cùng tĩnh riêng tư VALUES cho bộ nhớ đệm.

Truyền tham số tùy chọn làm tham số phương thức

Hãy xem xét đoạn mã sau:
LocalDateTime getCurrentTime(Optional<ZoneId> zoneId) {
    return zoneId.stream()
        .map(LocalDateTime::now)
        .findFirst()
        .orElse(LocalDateTime.now(ZoneId.systemDefault()));
}
Chúng tôi chuyển tham số ZoneId tùy chọn và dựa trên sự hiện diện của nó, quyết định xem có nên cung cấp thời gian theo múi giờ của hệ thống hay sử dụng múi giờ đã chỉ định hay không. Tuy nhiên, đây không phải là cách chính xác để làm việc với Tùy chọn. Chúng ta nên tránh sử dụng chúng làm tham số và thay vào đó hãy sử dụng nạp chồng phương thức.
LocalDateTime getCurrentTime(ZoneId zoneId) {
  return LocalDateTime.now(zoneId);
}

LocalDateTime getCurrentTime() {
  return getCurrentTime(ZoneId.systemDefault());
}
Mã bạn thấy ở trên dễ đọc và gỡ lỗi hơn nhiều.

Sử dụng StringBuilder

Chuỗi trong Java là bất biến. Điều này có nghĩa là một khi đã được tạo, chúng không thể chỉnh sửa được nữa. JVM duy trì một nhóm chuỗi và, trước khi tạo một nhóm chuỗi mới, gọi phương thức String.intern() , phương thức này trả về một thể hiện từ nhóm chuỗi tương ứng với giá trị, nếu có. Giả sử chúng ta muốn tạo một chuỗi dài bằng cách nối các phần tử vào đó.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
Gần đây chúng tôi được biết rằng đây là một ý tưởng rất tồi vì các phiên bản Java cũ hơn đã thực hiện những điều sau:
  • ở dòng 1, chuỗi “bắt đầu” được chèn vào nhóm chuỗi và được trỏ bởi longString
  • dòng 2 thêm chuỗi “startmiddle” vào nhóm và trỏ tới chuỗi đó bằng longString
  • trên dòng 3 chúng ta có “startmiddlemiddle”
  • ở dòng 4 - “startmiddlemiddlemiddle”
  • và cuối cùng ở dòng 5, chúng ta thêm “startmiddlemiddlemiddleend” vào nhóm và trỏ longString vào đó
Tất cả các hàng này vẫn còn trong nhóm và không bao giờ được sử dụng, dẫn đến lãng phí một lượng lớn RAM. Để tránh điều này chúng ta có thể sử dụng StringBuilder.
String longString = new StringBuilder()
  .append("start")
  .append("middle")
  .append("middle")
  .append("middle")
  .append("end")
  .toString();
StringBuilder chỉ tạo một chuỗi khi phương thức toString được gọi , do đó loại bỏ tất cả các chuỗi trung gian ban đầu được thêm vào nhóm. Tuy nhiên, sau Java 5, việc này được trình biên dịch thực hiện tự động , vì vậy tốt hơn nên sử dụng nối chuỗi bằng dấu “+”.

Sử dụng trình bao bọc nguyên thủy khi không cần thiết

Hãy xem xét hai đoạn sau:
int sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Integer sum = 0;
for (int i = 0; i < 1000 * 1000; i++) {
  sum += i;
}
System.out.println(sum);
Ví dụ đầu tiên chạy nhanh hơn sáu lần so với ví dụ thứ hai trên máy tính của tôi. Sự khác biệt duy nhất là chúng tôi sử dụng lớp trình bao bọc Integer. Cách thức hoạt động của Integer là trên dòng 3, bộ thực thi phải chuyển đổi biến tổng thành số nguyên nguyên thủy (tự động mở hộp) và sau khi phép cộng hoàn tất, kết quả sẽ được gói vào một lớp Integer mới. (đóng gói tự động). Điều này có nghĩa là chúng tôi đang tạo ra 1 triệu lớp Số nguyên và thực hiện hai triệu thao tác đóng gói, điều này giải thích cho sự chậm lại đáng kể. Các lớp trình bao bọc chỉ nên được sử dụng khi chúng cần được lưu trữ trong các bộ sưu tập. Tuy nhiên, các phiên bản Java trong tương lai sẽ hỗ trợ các tập hợp các kiểu nguyên thủy, điều này sẽ làm cho các trình bao bọc trở nên lỗi thời.

Cách sử dụng cuối cùng, cuối cùng và hoàn thiện trong Java

Nguồn: Newsshare Trong bài viết này, bạn sẽ tìm hiểu ở đâu, khi nào và tại sao từ khóa Finalize được sử dụng và liệu nó có đáng để sử dụng nó trong Java hay không. Bạn cũng sẽ tìm hiểu sự khác biệt giữa cuối cùng, cuối cùng và hoàn thiện.

Khối cuối cùng được sử dụng ở đâu?

Khối cuối cùng trong Java được sử dụng để chứa các phần mã quan trọng, chẳng hạn như mã dọn dẹp, đóng tệp hoặc đóng kết nối chẳng hạn. Khối cuối cùng thực thi bất kể ngoại lệ có được ném ra hay ngoại lệ đó có được xử lý hay không. Cuối cùng chứa tất cả các câu lệnh quan trọng cho dù ngoại lệ có xảy ra hay không.

Làm thế nào để bạn hoàn thiện một biến trong Java?

Có 3 cách để khởi tạo biến Java cuối cùng:
  • Bạn có thể khởi tạo biến cuối cùng khi nó được khai báo. Cách tiếp cận này là phổ biến nhất.
  • Một biến cuối cùng trống được khởi tạo trong khối hoặc hàm tạo khởi tạo cá thể.
  • Một biến tĩnh cuối cùng trống được khởi tạo bên trong một khối tĩnh.

Chúng ta có thể gọi phương thức hoàn thiện theo cách thủ công trong Java không?

Phương thức Finalize() không cần thiết và không được khuyến khích gọi khi một đối tượng nằm ngoài phạm vi. Bởi vì người ta không biết trước khi nào (hoặc liệu) phương thức Finalize() có được thực thi hay không . Nói chung, hoàn thiện không phải là phương pháp tốt nhất để sử dụng trừ khi có nhu cầu cụ thể về nó. Bắt đầu với Java 9, nó không được dùng nữa.

Khi nào phương thức hoàn thiện được gọi?

Phương thức Finalize() được gọi để thực hiện dọn dẹp ngay trước khi thu gom rác.

Sự khác biệt giữa cuối cùng, cuối cùng và hoàn thiện là gì?

Sự khác biệt chính giữa cuối cùng, cuối cùng và hoàn thiện là cuối cùng là một công cụ sửa đổi truy cập, cuối cùng là một khối xử lý ngoại lệ và hoàn thiện là một phương thức của một lớp đối tượng.

Có thể ghi đè các phương pháp cuối cùng không?

Không, các phương thức được khai báo cuối cùng không thể bị ghi đè hoặc ẩn.

Chúng ta có thể sử dụng thử mà không bắt được không?

Có, có thể có khối thử mà không có khối bắt bằng cách sử dụng khối cuối cùng . Như chúng ta đã biết, khối cuối cùng sẽ luôn được thực thi ngay cả khi có bất kỳ ngoại lệ nào khác ngoài Hệ thống xảy ra trong khối thử.

Phương pháp cuối cùng là gì?

Các phương thức cuối cùng không thể bị ghi đè hoặc ẩn bởi các lớp con. Chúng được sử dụng để ngăn chặn hành vi không mong muốn của một lớp con sửa đổi một phương thức có thể quan trọng đối với chức năng hoặc tính nhất quán của lớp.

Một hàm tạo có thể là cuối cùng không?

Các nhà xây dựng KHÔNG BAO GIỜ có thể được tuyên bố là cuối cùng. Trình biên dịch của bạn sẽ luôn đưa ra lỗi như "không cho phép sửa đổi cuối cùng". Cuối cùng khi áp dụng cho các phương thức có nghĩa là phương thức đó không thể bị ghi đè trong một lớp con. Các nhà xây dựng KHÔNG phải là phương pháp thông thường.

Từ khóa cuối cùng được sử dụng để làm gì?

Từ khóa cuối cùng được sử dụng để tạo khối mã theo sau khối thử. Khối cuối cùng luôn được thực thi bất kể có xảy ra ngoại lệ hay không. Việc sử dụng khối cuối cùng cho phép bạn chạy bất kỳ câu lệnh loại thư giãn nào mà bạn muốn thực thi, bất kể điều gì đang xảy ra trong mã được bảo vệ.

Rốt cuộc có ích gì?

Khối cuối cùng trong Java là khối được sử dụng để thực thi các phần mã như đóng kết nối và các phần khác. Khối cuối cùng trong Java luôn được thực thi cho dù ngoại lệ có được xử lý hay không. Do đó, nó chứa tất cả các câu lệnh cần thiết cần được in ra dù có xảy ra ngoại lệ hay không.

Tại sao phương pháp Finalize được bảo vệ?

Tại sao công cụ sửa đổi truy cập phương thức Finalize() được bảo vệ? Tại sao nó không thể được công khai? Nó không được công khai vì nó không được gọi bởi bất kỳ ai khác ngoài JVM. Tuy nhiên, nó phải được bảo vệ để có thể bị ghi đè bởi các lớp con cần xác định hành vi cho nó.

Phương thức hoàn thiện có luôn được gọi trong Java không?

Phương thức hoàn thiện được gọi khi một đối tượng sắp được thu gom rác. Điều này có thể xảy ra bất cứ lúc nào sau khi nó đủ điều kiện để thu gom rác. Lưu ý rằng hoàn toàn có khả năng đối tượng không bao giờ được thu gom rác (và do đó việc hoàn thiện không bao giờ được gọi).

Sự khác biệt giữa ném và ném là gì?

Từ khóa ném được sử dụng để cố tình ném một ngoại lệ. Từ khóa ném được sử dụng để khai báo một hoặc nhiều ngoại lệ, được phân tách bằng dấu phẩy. Khi sử dụng Throw, chỉ có một ngoại lệ được ném ra.

Sự khác biệt giữa từ khóa thử bắt và cuối cùng là gì?

Đây là hai khái niệm khác nhau: khối bắt chỉ được thực thi nếu có ngoại lệ xảy ra trong khối thử. Khối cuối cùng luôn được thực thi sau khối try(-catch), bất kể ngoại lệ có được ném ra hay không.

Chúng ta có thể sử dụng cuối cùng mà không cần thử trong Java không?

Khối cuối cùng phải được liên kết với khối thử, bạn không thể sử dụng cuối cùng nếu không có khối thử. Bạn phải đặt trong khối này những câu lệnh phải luôn được thực thi.

Chúng ta có thể kế thừa phương pháp cuối cùng không?

Phương pháp cuối cùng có được kế thừa không? Có, phương thức cuối cùng được kế thừa nhưng bạn không thể ghi đè lên nó.

Phương pháp nào không thể bị ghi đè?

Chúng ta không thể ghi đè các phương thức tĩnh vì việc ghi đè phương thức dựa trên liên kết động trong thời gian chạy và các phương thức tĩnh bị ràng buộc bằng cách sử dụng liên kết tĩnh tại thời gian biên dịch. Vì vậy, việc ghi đè các phương thức tĩnh là không thể.

Điều gì xảy ra nếu phương thức cuối cùng bị ghi đè?

Phương thức cuối cùng được khai báo trong lớp cha không thể bị ghi đè bởi lớp con. Nếu chúng ta cố gắng ghi đè phương thức cuối cùng, trình biên dịch sẽ đưa ra một ngoại lệ vào thời điểm biên dịch.

Từ khóa cuối cùng và phương thức hoàn thiện có hoạt động giống nhau không?

Không có điểm tương đồng nào về chức năng của chúng, ngoại trừ tên tương tự. Từ khóa cuối cùng có thể được sử dụng với một lớp, phương thức hoặc biến trong Java. Lớp cuối cùng không thể mở rộng trong Java, phương thức cuối cùng không thể bị ghi đè và biến cuối cùng không thể sửa đổi.

Từ khóa siêu trong Java là gì?

Từ khóa super trong Java là một biến tham chiếu được dùng để chỉ đối tượng trực tiếp của lớp cha. Bất cứ khi nào bạn khởi tạo một lớp con, một thể hiện của lớp cha sẽ được tạo song song, được tham chiếu bởi biến tham chiếu super. Từ khóa super có thể được sử dụng để gọi trực tiếp một phương thức của lớp cha.

Sự khác biệt giữa từ khóa tĩnh và từ khóa cuối cùng là gì?

Sự khác biệt chính giữa từ khóa tĩnh và từ khóa cuối cùng là từ khóa tĩnh được sử dụng để xác định thành viên của một lớp có thể được sử dụng độc lập với bất kỳ đối tượng nào của lớp đó. Từ khóa Final được sử dụng để khai báo một biến không đổi, một phương thức không thể ghi đè và một lớp không thể kế thừa.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION