2014-09-23 20 views
10

Ai đó có thể tưởng tượng khi mã này:nên MAIN phương pháp sao chép đối số đầu vào?

public static void main(final String[] args) { 
    // do something 
} 

nên trở thành này:

public static void main(final String[] args) { 
    String[] argsCopy = doCopy(args); 
    // do something 
} 

(Trong công ty chúng tôi, chúng tôi có một quy tắc Sonar rằng các lực lượng đối phó như vậy hoặc đối số cho tất cả các phương pháp này.) Tôi có thể tưởng tượng tại sao nó có thể quan trọng đối với các phương pháp tiêu chuẩn, nhưng tôi không thể tìm thấy bất kỳ lợi ích nào của việc thực hiện nó khi bắt đầu các phương pháp chính của công cụ. Tui bỏ lỡ điều gì vậy?

+5

Bạn rõ ràng nên sử dụng các ngôn ngữ không thể thay đổi trạng thái người gọi. Điều đó đang được nói, nó là người nghèo công cụ không nhận ra nếu đối số là thực sự đột biến. – Ingo

+0

một số cuộc thảo luận ở đây: http://stackoverflow.com/questions/11580948/sonar-violation-security-array-is-stored-directly –

+1

Tôi không phải là người đam mê quy tắc sonar này. Hơn thế nữa - tôi coi quy tắc này là ý tưởng tồi. Điều gì xảy ra nếu tôi muốn lưu trữ byte dữ liệu nhị phân lớn [] trong các đối tượng của tôi? Sao chép sau đó chỉ sau khi được xây dựng từ một số dòng là không cần thiết theo ý kiến ​​của tôi. –

Trả lời

6

Lý do bạn sao chép tham số mảng là để tránh khả năng ai đó sửa đổi mảng khi bạn đã xác thực các phần tử của nó. Đây là một kỹ thuật phòng thủ rất tốt, bảo vệ bạn khỏi các cuộc gọi nguy hiểm trong một người gọi.

Tuy nhiên, trong trường hợp này người gọi là JVM. Nếu bạn không tin tưởng JVM không có mã độc, bạn có một vấn đề lớn hơn nhiều so với một cái gì đó có thể được giải quyết bằng cách sao chép một mảng.

Ngoại lệ duy nhất là khi bạn vượt qua args một số chức năng của mình. Trong trường hợp này, tạo một bản sao là một ý tưởng rất hay, trong trường hợp một số phương pháp quyết định thay đổi nội dung của args. Đó là trường hợp duy nhất tôi khuyên bạn nên tạo một bản sao. Nếu main là nơi duy nhất mà sử dụng args, không cần sao chép.

2

tôi có thể tưởng tượng một chút, hai rõ ràng nhất (với tôi) là:

  • Nếu bạn thay đổi chúng nhưng vẫn cần phải tham khảo các giá trị ban đầu
  • Nếu bạn sử dụng main như là một " phương thức "bình thường", ví dụ, không chỉ được gọi từ dòng lệnh

Nói chung, nó không phải là siêu hữu ích trong trường hợp này.

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