Một điều cuối cùng để thêm vào những gì mọi người đã nói ở đây.
Sử dụng phương thức static
có chi phí thấp hơn một chút do thực tế bạn đã đảm bảo ràng buộc thời gian biên dịch. Các cuộc gọi phương thức tĩnh sẽ tạo hướng dẫn bytecode invokestatic
. ]
Trong trường hợp điển hình, các phương pháp mẫu được ràng buộc trong thời gian chạy và sẽ tạo hướng dẫn bytecode invokevirtual
có chi phí cao hơn invokestatic
.
Tuy nhiên, điều này chỉ trở nên có liên quan trong trường hợp có khả năng là hàng triệu lần lặp lại và tôi sẽ thận trọng khi điều này thúc đẩy thiết kế lớp học của bạn. Làm những gì có ý nghĩa từ quan điểm thiết kế. Dựa trên mô tả của bạn, các phương pháp static
có thể là cách để đi. Thực tế, đây là cách thực hành tương đối chuẩn để tạo lớp tiện ích:
public class MyUtilities {
private MyUtilities() { } // don't let anyone construct it.
public static String foo(String s) { ... }
}
Câu chuyện phức tạp hơn một chút vì 'invokevirtual' không phải là một chỉ dẫn máy thực tế. Trong trường hợp xấu nhất nó sẽ được thực hiện như là một trang web gọi đơn sắc, nhưng nếu lớp là cuối cùng (hoặc hiệu quả cuối cùng bởi đức hạnh của nhà xây dựng tư nhân), nó sẽ là một cuộc gọi hardwired. Ngay cả khi không có điều đó, thời gian chạy có thể nhận thấy rằng không có lớp con và hardwire cuộc gọi nào. –
Vâng, tôi hiểu nó không đảm bảo rằng nó không phải là hardwired, nhưng tôi đã cố gắng để giữ cho lời giải thích đơn giản, như hầu hết mọi người không hiểu nội bộ của jvm. – Matt
Tôi phải nói từ ngữ của bạn là gây hiểu nhầm. Không có "kịch bản điển hình" ở đây: lời gọi phương thức cá thể ** luôn luôn ** biên dịch thành 'invokevirtual'; tương tự như vậy với phương thức tĩnh và 'invokestatic'. –