2013-02-04 32 views
27

Tôi đã hỏi câu hỏi này trong một cuộc phỏng vấn gần đây:Các lớp học cuối cùng trong Java không nên là cuối cùng hoặc ngược lại?

Bạn có thể đặt tên cho bất kỳ lớp trong Java API đó là cuối cùng không nên hoặc một trong đó không là gì và nên '?

Tôi không thể nghĩ ra được. Câu hỏi ngụ ý rằng tôi nên biết tất cả các lớp API như mặt sau của bàn tay của tôi, mà cá nhân tôi sẽ không mong đợi bất kỳ nhà phát triển Java để biết.

Nếu có ai biết bất kỳ lớp học nào như vậy, vui lòng cung cấp các ví dụ.

+2

Có lẽ thử nghiệm là về trải nghiệm của bạn với API Java, điều đó không có nghĩa là bạn nên biết điều đó bằng trái tim. – Bogdan

+3

Tại một số điểm, chủ yếu là khi gỡ lỗi mã khủng khiếp, tôi sẽ đề nghị rằng 'Object' nên đã được thực hiện cuối cùng. –

+3

Bạn không làm rõ câu hỏi bạn muốn hỏi. Bạn đang tìm kiếm một ví dụ, hoặc ý kiến ​​về câu hỏi phỏng vấn, hay người nào khác? –

Trả lời

21

Các ví dụ đầu tiên mà tôi suy nghĩ là một số trong các lớp con số không chính thức, chẳng hạn như BigDecimalBigInteger, mà có lẽ cần phải có được thức.

Cụ thể, tất cả các phương pháp của họ có thể được ghi đè lên. Cho phép bạn tạo ra một tấm BigDecimal, ví dụ:

public class BrokenBigDecimal extends BigDecimal { 
    public BigDecimal add(BigDecimal augend) { 
     return BigDecimal.ZERO; 
    } 
}  

rằng có thể tạo ra các vấn đề quan trọng nếu bạn nhận BigDecimal từ một mã không tin cậy chẳng hạn.

Để diễn giải hiệu quả Java:

  • Thiết kế và tài liệu cho các thừa kế hoặc nếu không cấm nó
  • Lớp học nên không thể thay đổi trừ khi có một lý do rất tốt để làm cho họ có thể thay đổi
+1

+1 java.math.BigInteger quá –

+0

docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html –

+1

Bạn có thể thiết kế danh sách/bộ sưu tập bị hỏng/etc, BigDecimal, BigInteger là ok không phải là cuối cùng imo. Bạn có thể theo dõi chúng nếu bạn muốn. Cuối cùng sẽ không giúp gì trong trường hợp của họ. – bestsss

-2

Kiểm tra lớp Chuỗi cuối cùng và có lẽ phải là câu trả lời của bạn trong cuộc phỏng vấn.

Kiểm tra tài liệu.

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

+7

Tại sao nó * không * cuối cùng? –

+1

Vâng, .NET ['String'] (http://msdn.microsoft.com/en-us/library/system.string.aspx) là * cũng * cuối cùng * và * không thay đổi, giống như của Java. –

+1

Ngoài sự tò mò; những gì sẽ là lý do của bạn để nói rằng nó không nên là cuối cùng? Vì bạn nói nó là _obvious_. ;) –

22

java.awt.Dimension isn' t cuối cùng hoặc bất biến và nên có được. Bất cứ điều gì mà trả về một Kích thước (ví dụ như một đối tượng Window) cần phải thực hiện các bản sao phòng thủ để ngăn chặn người gọi làm những điều khó chịu.

+0

Nó không phải là bất biến do trong những ngày cũ, tạo ra các đối tượng mới (và GC tiếp theo) không chính xác giá rẻ, tương tự như vậy Point/Rectangle. Những lớp đó nên có giá trị giống nhau nhưng tại thời điểm java thiếu điều khoản như vậy. – bestsss

+0

Rất tiếc, đó là một tối ưu hóa không hợp lệ. Để lại nó có thể thay đổi có nghĩa là sự cần thiết để tạo ra các bản sao phòng thủ để lại để tăng phân bổ/rác không ít hơn. –

+0

Làm thế nào? bạn vượt qua tham số như tham số, đó là ý tưởng. Ngoài ra các bản sao chỉ cần thiết cho mã không gian khách, bên trong awt đối tượng được truy cập bởi các trường của nó (không có bản sao). Tôi không bảo vệ rời khỏi các lĩnh vực công khai của chiều hướng, mặc dù .. chỉ giải thích - làm cho nó cuối cùng sẽ không có ích cho riêng mình. – bestsss

3

Theo tôi, câu trả lời của bạn phải là một vấn đề về hương vị lớp nào nên là cuối cùng và không nên.

Có nhiều lý do chính đáng để thực hiện Integer, DoubleString tất cả final.

Có nhiều lý do chính đáng để khiếu nại về điều này.

Sau đó, có BitSet, BitInteger v.v. có thể được thực hiện final.

Có một số tình huống trong đó lớp học không phải là final, nhưng chúng cũng không thể được mở rộng hợp lý, vì vậy có lẽ chúng phải được thực hiện cuối cùng.

Để chọn một lớp học cụ thể: BitSet. Nó không phải là final, nhưng bạn không thể mở rộng nó để thêm một hoạt động bit shift.Họ cũng có thể đã làm cho nó final sau đó hoặc cho phép chúng tôi thêm chức năng như vậy.

+0

Tôi không nghĩ rằng đó chỉ là vấn đề về hương vị - Nhiều tính năng bảo mật của ngôn ngữ lập trình Java phụ thuộc vào các đối tượng String là bất biến chẳng hạn. Và nếu bạn muốn có sự biến đổi, bạn có lớp đồng hành có thể thay đổi, StringBuilder. – assylias

+0

@assylias Tôi đã nói có lý do chính đáng để có 'Chuỗi'' final' ... –

1

Lớp học Date nhảy ra ngoài. Nó là một lớp giá trị đơn giản có thể thay đổi (về cơ bản là một trình bao bọc xung quanh một long), nhưng một heuristic tốt là các lớp giá trị đơn giản nên không thay đổi. Cũng lưu ý nhiều phương pháp không dùng nữa của nó: nhiều bằng chứng cho thấy thiết kế đã bị hỏng. Tính đột biến của Datea source of bugs, requiring disciplined defensive copying.

+0

Xem thêm: http://stackoverflow.com/a/187314/545127 – Raedwald

+0

Lớp dữ liệu được sublcassed bởi java.sql.Date/Time/Dấu thời gian, là cuối cùng sẽ không giúp đỡ vì nó có phương thức setter. Trên thực tế là không phải là cuối cùng là tốt như bạn có thể ghi đè lên các setters và ném UnsupportedOperationException, làm cho lớp không thay đổi. – bestsss

+0

@bestsss "vì nó có phương thức setter": điểm là, 'Date' không nên có phương thức setter. – Raedwald

0

một trong đó không là gì và nên

Hầu hết các lớp học chính thức trong java được thiết kế như vậy do w/cân nhắc an ninh trong tâm trí, tổng thể có tương đối ít những trận chung kết. Ví dụ java.util.String là cuối cùng vì lý do đó. Có rất nhiều người khác. Một số lớp w/private c-tor được khai báo cuối cùng (Math, StrictMath) nhưng nó không quan trọng trong trường hợp này. Về cơ bản trừ khi có vấn đề bảo mật liên quan tôi không quan tâm nếu lớp học là cuối cùng, nhưng bạn luôn có thể sử dụng c-tor không công khai w/một số nhà máy, có hiệu quả hạn chế khả năng phân lớp. Thông thường đó là cách ưa thích của tôi vì nó cho phép phân lớp con riêng tư.

Tóm lại: Tôi không thể nghĩ ra một lớp học cuối cùng không nên, tuy nhiên có một số khả năng có thể xảy ra. Ví dụ: java.lang.Thread là kết quả cuối cùng có thể không cần thiết để bảo vệ và chống độc hại clone().

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