2014-10-14 10 views
14

Tôi đã tự hỏi nếu hai cái này giống nhau. Bất cứ ai có thể xác minh? (Tôi cố gắng để thay thế 1st với 2nd)BigDecimal.ZERO so với BigDecimal mới (0). Mà để sử dụng và tại sao?

BigDecimal totalCurrentSales = new BigDecimal(0); 

BigDecimal totalCurrentSales = BigDecimal.ZERO; 

Lý do tôi hỏi là nó không thích hợp để khai báo nó theo cách đầu tiên kể từ khi bạn đang không được phép tạo trường đã tồn tại BigIntegerBigDecimal (ZERO, ONE, TEN). Vì vậy, tôi đã tự hỏi nếu tôi có thể nói nó theo cách thứ hai và nó vẫn được coi là tạo ra một ví dụ. Thay vì tôi phải tạo một biến số zero hoặc cái gì đó tương đương với BigDecimal.ZERO. Hay có cách nào khác không?

tôi đã cố gắng

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO); 

nhưng nhật thực không quá hạnh phúc.

+0

Có, tôi có. Chỉ cần tìm kiếm một giải pháp – erp

+2

Nếu bạn thực sự hiểu những khái niệm này, thì bạn có thể đã biết giải pháp: sử dụng sau 'BigDecimal totalCurrentSales = BigDecimal.ZERO;'. –

+0

Alrighty sau đó, chỉ đảm bảo rằng tôi có thể làm điều đó vì tôi vẫn cần một trường hợp mới, nhưng cố gắng loại bỏ '0' – erp

Trả lời

22

Về mặt toán học, chúng giống nhau. Ngoài ra, vì BigDecimals không thay đổi, bạn không cần phải lo lắng về việc tạo các phiên bản mới để thực hiện các phép tính mới. Ngay khi bạn thực hiện một số thao tác trên cá thể totalCurrentSales của mình, bạn sẽ thực sự tạo một BigDecimal mới và gán lại tham chiếu totalCurrentSales với giá trị mới.

Từ phối cảnh instantiation, chúng không nhất thiết giống nhau. Trong thực hiện OpenJDK 6b14, ví dụ, BigDecimal.ZERO được tạo bằng cách gọi hàm tạo riêng new BigDecimal(BigInteger, long, int) với các giá trị BigInteger.ZERO, 00.

Từ góc độ chất lượng mã, sử dụng BigDecimal.ZERO thích hợp hơn là new BigDecimal(0) khi bạn tránh sự khởi tạo bổ sung và có chữ trong mã của bạn.

+3

Đó là phân đoạn cuối cùng của những gì bạn nói thực sự là những gì tôi đang tìm kiếm tất cả cùng. Sự thù địch ở đây ngoài bảng xếp hạng. Cám ơn phản hồi của bạn. Một câu trả lời rõ ràng và súc tích. +1 – erp

+1

Việc sử dụng các hàm tạo khác nhau dẫn đến 'BigDecimal.ZERO' là 'tăng cao' và 'BigDecimal (0)' mới bằng cách sử dụng một biểu diễn nhỏ gọn về số nội bộ. Điều đó có thể ảnh hưởng đến hiệu suất. – Kapep

+0

Tôi chỉ cần biết giải pháp khi nó xuất hiện trong lỗi Sonar. Tôi biết hiệu suất khôn ngoan nó là không đáng kể nhưng chỉ muốn để có được nó ở trạng thái ưa thích, vì đó là những gì sonar là cho int nơi đầu tiên. – erp

5

BigDecimal không có hàm tạo nên tham số BigDecimal làm đối số, do đó giải thích tại sao Eclipse không hài lòng với điều đó.

BigDecimal là không thay đổi, có nghĩa là khi bạn tạo một đối tượng, trạng thái của nó không bao giờ thay đổi.

Ngoài ra phương thức equals và hashcode của BigDecimal được ghi đè để đi theo giá trị, trái với thực thi mặc định của đối tượng, so sánh tham chiếu. Vì vậy, không có sự khác biệt giữa BigDecimal.ZERO và BigDecimal mới ("0") từ quan điểm về cách chúng được sử dụng, ngoại trừ việc tạo một cá thể mới là nhiều công việc cho JVM (và sẽ tạo ra nhiều rác hơn khi bạn don ' t cần đối tượng đó nữa).

BigDecimal không thay đổi và dựa trên giá trị nghĩa là tham chiếu cụ thể nào được sử dụng sẽ không quan trọng đối với mã sử dụng BigDecimal.

Vì BigDecimal.ZERO đã được tạo cho bạn và so sánh giữa BigDecimals theo giá trị, nên giảm thiểu số lượng giá trị bạn sử dụng sao cho chương trình của bạn tạo ít rác hơn. Đó là lý do tại sao bạn được khuyến khích sử dụng BigDecimal.ZERO.

+0

Tôi đã định sử dụng 'BigDecimal.ZERO; 'ở nơi đầu tiên, tôi chỉ cố gắng hiểu tất cả những điều sau trong các bình luận trên op. Cảm ơn bạn đã trả lời tho. Tôi đã kiểm tra nó nhưng tôi đã nhìn thấy cái kia trước. 1 cho được tho tốt đẹp :) – erp

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