2013-06-27 40 views
20

Tôi gặp sự cố với quy tắc PMD Avoid instantiating new objects inside loops. Dưới đây là một số mã ví dụ:PMD: Tránh tạo đối tượng mới trong vòng lặp

import java.awt.Dimension; 

public class PMDDemo { 
    public static void main(final String[] args) { 
     final Dimension[] arr = new Dimension[10]; 
     for (int i = 0; i < arr.length; i++) { 
      arr[i] = new Dimension(i, i); // rule violation here 
     } 
    } 
} 

PMD mang lại cho tôi vi phạm quy tắc nêu trên ở vị trí đáng kể trong các mã. Làm cách nào để tạo ra các trường hợp n của một lớp học mà không cần tạo chúng trong vòng lặp?

Tôi biết rằng một số quy tắc của PMD đang gây tranh cãi (như quy tắc onlyOneExit). Nhưng đến giờ tôi ít nhất cũng hiểu ý tưởng đằng sau chúng. Tôi không hiểu lý do đằng sau quy tắc này. Ai đó có thể giúp tôi với?

+4

Không có ý nghĩa gì trong kịch bản này (hoặc trong hầu hết các trường hợp mà tôi có thể nghĩ) ... – assylias

+3

Điều tôi cho là quy tắc này đang cố gắng lưu trữ là đối tượng gộp cho các đối tượng sống ngắn và tôi hiểu một ý tưởng hay trong những ngày này: http://programmers.stackexchange.com/questions/149563/should-we-avoid-object-creation-in-java –

+0

@assylias Bạn có nghĩ về một kịch bản có ý nghĩa không? Nếu không, tôi sẽ tắt quy tắc. – brimborium

Trả lời

22

Đối với trường hợp sử dụng cụ thể của bạn, điều này không có ý nghĩa khi bạn giữ tham chiếu đến đối tượng mới sau vòng lặp. Vì vậy, không có giải pháp thay thế thực sự nào cho giải pháp của bạn.

Nói chung, creating short lived objects in Java is cheap * (ngoài chi phí ẩn mà GC sẽ chạy thường xuyên hơn). Đặc biệt, việc phân bổ hầu như miễn phí và thời gian của GC chủ yếu phụ thuộc vào số lượng các đối tượng có thể truy cập - các đối tượng chết không tăng thời gian GC cho các thuật toán GC điển hình.

JIT cũng có thể thực hiện các tối ưu hóa khác nhau nếu phát hiện các đối tượng không cần thiết được tạo ra.

Rõ ràng, việc tạo ra vô dụng không phải là một thực hành được khuyến nghị, nhưng cố gắng sử dụng lại các đối tượng thường phản tác dụng. Một ví dụ thực tế, bạn có thể xem this post cho thấy việc tạo một bộ mới trong vòng lặp rẻ hơn việc tạo một bộ mới trước vòng lặp và xóa nó ở mỗi lần lặp.

* Cảm ơn @RichardTingle cho liên kết

0
for (int i = 0; i < arr.length; i++) { 
    arr[i] = new Dimension(i, i); // rule violation here 
} 

Các Trên PMD có thể được giải quyết bằng

for (int i = 0; i < arr.length; i++) { 
    arr[i] = createNewDimension(i,i); // rule violation here 
} 

private static Dimension createNewDimension(i,i) { 
    return new Dimension(i, i); 
} 

chúng ta nên không trực tiếp sử dụng nhà điều hành mới bên trong một vòng lặp chỉ di chuyển này bên trong một tin phương pháp.

+1

Cảm ơn bạn đã nhập. Bạn có thực sự thích phiên bản được giải quyết (với trình bao bọc tạo) không? Tôi nghĩ rằng điều này làm cho nó ít dễ đọc hơn. Nhưng có lẽ tôi đang thiếu cái gì đó. 1 cho thực sự giải quyết vi phạm mặc dù. – brimborium

Các vấn đề liên quan