2011-10-28 34 views
11

Đây là một câu hỏi tiếp theo cho các câu hỏi 1 & 2.Các vấn đề về Findbugs có khả năng biến đổi của đối tượng Ngày trong Java

Như đã nói trong câu hỏi vào mã bên dưới

public Date getSomeDate() { 
    return someDate; 
} 

sẽ cung cấp cho bạn các lỗi findbug issue.

Các giải pháp đề nghị là để lặp lại trong các đối tượng Date trong cả getter và setter như

public Date getSomeDate() { 
    return new Date(someDate.getTime()); 
} 

Đây có phải là một cách tiếp cận tốt hay là có cách nào thay thế cho điều này?

Có thư viện Ngày không thay đổi nào có sẵn trong java có thể khắc phục sự cố này không?

+0

bạn có nghĩa là bất biến phải không? dù sao đi nữa, cách tiếp cận đã nêu là hoàn hảo. –

+0

@PrinceJohnWesley: cảm ơn và Có. Tôi đã cập nhật các câu hỏi. Bạn có nghĩa là để nói ok của nó để sử dụng constructor Date trong tất cả các getters và setter? – ManuPK

+0

Miễn là bạn không để lộ các cuộc gọi đến thư viện bên ngoài. bạn không cần phải sao chép sâu (constructor) nó bởi vì bạn biết những gì bạn làm. Nếu không, luôn luôn cung cấp cho các tài liệu tham khảo khác biệt nếu nó là mutable. Hãy thử joda thời gian api –

Trả lời

6

JodaTime có ngày không thay đổi.

Chắc chắn, bạn có thể sử dụng công cụ xây dựng Date trong bộ thu thập dữ liệu, tại sao không? Điều đó nói rằng, chỉ vì FindBugs chốt trạng thái có thể thay đổi là một lỗi tiềm năng, nó không có nghĩa là nó có giá trị thực sự quan tâm đến – nó phụ thuộc vào cách lớp đang được sử dụng. Tính không thay đổi loại bỏ một loại lỗi mà bạn có thể hoặc không cần quan tâm nhiều.

0

Tùy thuộc vào trường hợp sử dụng, bạn có thể trả lại someDate.getTime() mà không cần gói nó trong Date.

0

Chờ một phút ... bằng cách sao chép đối tượng trong các phương thức getSomeDatesetSomeDate, chúng tôi sẽ không loại bỏ nguy cơ bảo mật vì đối tượng đã thay đổi quay trở lại thông qua setSomeDate và bản sao lưu giữ các giá trị đã thay đổi. Bạn cần phải xóa setSomeDate để giải quyết vấn đề bảo mật này hoặc đừng lo lắng gì về nó.

+2

Bằng cách trả về một bản sao của đối tượng, chúng ta tránh biểu diễn bên trong được chia sẻ - nó sẽ giúp tránh các tình huống mà mã gọi (ngay cả khi nó nhận thuộc tính này đến một biến cục bộ) đã thay đổi. Để nói rõ ràng, setsomeDate không thể được gỡ bỏ vì đó là hành vi bean cơ bản. – emeralddove

7

Attention Folks ...

ngoài thích nghi với cả hai phương thức getter và setter bạn cần phải chăm sóc về các giá trị null:

public Date getSomeDate() { 
    if (this.someDate == null) { 
    return null; 
    } 
    return new Date(this.someDate.getTime()); 
} 

public void setSomeDate(final Date someDate) { 
    if (someDate == null) { 
    this.someDate = null; 
    } else{ 
    this.someDate = new Date(someDate.getTime()); 
    } 
} 
Các vấn đề liên quan