Tôi có cái này trong mã của mình
Thread.currentThread().sleep(x);
Eclipse yêu cầu tôi sử dụng tĩnh
Thread.sleep(x);
thay vào đó, tại sao? Sự khác biệt là gì, có sự khác biệt nào đó về chức năng giữa 2 phương pháp này không?
Tôi có cái này trong mã của mình
Thread.currentThread().sleep(x);
Eclipse yêu cầu tôi sử dụng tĩnh
Thread.sleep(x);
thay vào đó, tại sao? Sự khác biệt là gì, có sự khác biệt nào đó về chức năng giữa 2 phương pháp này không?
Câu trả lời:
Chỉ có một phương thức, không phải hai, và nó là tĩnh. Mặc dù bạn có thể gọi một phương thức tĩnh thông qua một tham chiếu cá thể, nhưng đó không phải là kiểu tốt. Nó cho biết lập trình viên nghĩ rằng họ đang gọi một phương thức thể hiện. Một lập trình viên bối rối có thể nghĩ rằng anh ta hoặc cô ta có thể khiến một luồng khác (không phải luồng hiện tại) ngủ theo cách này, khi đó không phải là những gì nó làm.
Cả hai dòng mã của bạn đều làm điều tương tự nhưng thứ hai là phong cách tốt hơn.
Trong Java, sleep là một phương thức tĩnh. Cả hai ví dụ của bạn đều thực hiện chính xác những điều tương tự, nhưng phiên bản cũ gây nhầm lẫn vì có vẻ như nó đang gọi một phương thức trên một đối tượng cụ thể nhưng nó không thực hiện điều đó chút nào. Trong ví dụ của bạn, điều đó sẽ không quan trọng lắm, nhưng sẽ nguy hiểm hơn nếu bạn có những điều sau:
someOtherThread.sleep(x);
Lần này có vẻ như bạn đang nói với một số luồng khác ở chế độ ngủ, nhưng thực tế là bạn đang đặt luồng hiện tại ở chế độ ngủ. Cách để tránh mắc lỗi kiểu này là luôn gọi các phương thức tĩnh bằng cách sử dụng lớp thay vì một đối tượng cụ thể.
Hai cuộc gọi phương thức giống hệt nhau về hành vi vì chúng gọi cùng một phương thức nhưng sử dụng tên lớp ( Thread trong trường hợp này) thay vì đối tượng để truy cập các trường tĩnh và các phương thức làm cho nội dung tĩnh này rõ ràng. Đó là lý do tại sao cảnh báo này được tạo ra.
Nhưng xem xét rằng các trường và phương thức tĩnh được hiển thị theo một cách cụ thể trong hầu hết các IDE (ví dụ: bằng phông chữ nghiêng trong Eclipse và IntelliJ IDEA), cảnh báo này có còn cần thiết không? Có thể không cần thiết như những ngày đầu của Java mà các trình soạn thảo đơn giản được sử dụng.
Thread.currentThread().sleep(x);
hoặc theo cách Eclipse nói vì vậy Thread.sleep(x);
ngữ cảnh tĩnh là bắt buộc nếu cần thiết, vì vậy chúng tôi chờ đợi một chút thời gian trễ với chế độ ngủ này.
Mô hình tĩnh được thiết lập bởi một đối tượng, chỉ ảnh hưởng đến vòng đời in heap của đối tượng cụ thể đó, một lần nữa xem xét tổng thể Vòng đời đối tượng, tĩnh không phải là điều khó chịu, nếu cần, nó có thể được sử dụng để dễ mã hóa, nhưng được thực hiện cẩn thận như chân tĩnh- print được gọi bởi Class
(ví dụ: - Class.forName(pkg.className)
) giống như tên chứ không phải bởi bất kỳ object
mà là bản sao in một lần trong thời gian chạy của Lớp trong HEAP
bộ nhớ.
Một lần nữa, việc sử dụng đối tượng cũng có ưu và nhược điểm bởi các loại tham chiếu Yếu, Bóng ma, Mạnh ...,
Mã được biến đổi bởi tự nhiên. Nó chỉ là cách chúng tôi làm để làm cho nó hoạt động và hoạt động.