Tôi chắc chắn có thể nghĩ về các tình huống mà tôi muốn thích ngoại lệ là lớp bên trong tĩnh hơn là chỉ một lớp trong cùng một gói.
Những lý do không nên làm như vậy dường như là:
- Khớp nối các ngoại lệ đối với lớp mà ném nó làm cho nó không thích hợp để tái sử dụng trong những bối cảnh khác
- Không ai khác nó
Tôi không tìm thấy một trong những lập luận đó ở tất cả các thuyết phục.
Đối với điểm đầu tiên, tại sao cơ hội giả thuyết trong tương lai này để tái sử dụng trong cùng một gói? Lập luận này dẫn đến kết luận rằng chúng ta nên đặt tất cả các lớp ngoại lệ càng cao càng tốt trong phân cấp gói để khi chúng ta khám phá ra một cơ hội trong tương lai để tái sử dụng cùng một ngoại lệ, chúng ta không phải giới thiệu sự phụ thuộc vào nơi nó được định nghĩa ban đầu.
Nhưng ngay cả khi không có điểm "bị đưa đến cực đoan", hãy xem xét ngoại lệ nhằm truyền đạt lớp đó Foo
được nhập sai. Nếu tôi gọi nó là Foo.InvalidInput
, tên này ngắn và liên kết với Foo
là không thể bỏ qua. Nếu tôi đặt nó bên ngoài lớp Foo
và gọi nó là FooInvalidCriteria
, thì tôi không thể sử dụng lại nó từ lớp Bar
, mà không thay đổi tên của nó (tương đương với thay đổi vị trí của nó).
Nhưng điều tồi tệ nhất là nếu tôi để nó ở bên ngoài Foo
và giữ tên chung như InvalidInput
. Sau đó, khi tôi nhận ra rằng Bar
cũng có thể có thông tin nhập không hợp lệ và làm cho nó bắt đầu ném ngoại lệ này. Mọi thứ biên dịch và chạy tốt, chỉ bây giờ tất cả các địa điểm bắt được InvalidInput
và giả sử chúng xử lý các lỗi từ Foo
bây giờ cũng có thể xử lý lỗi từ Bar
nếu Foo
xảy ra sử dụng Bar
nội bộ theo cách có thể gây ra ngoại lệ này. Điều này có thể dễ dàng gây ra sự cố mã. Thực tế là lấy một ngoại lệ mà trước đây đã được hình thành như cụ thể cho thấy một tình huống phát sinh trong một lớp và tái sử dụng nó như là một lớp lỗi chung là một sự thay đổi giao diện, chứ không chỉ là thay đổi thực hiện nội bộ. Để làm như vậy một cách chính xác nói chung bạn phải truy cập lại tất cả các trang web nơi ngoại lệ bị bắt và đảm bảo chúng vẫn đúng, vì vậy trình biên dịch cho bạn biết về tất cả các trang web sử dụng (vì bạn phải thay đổi tên và/hoặc đường dẫn nhập) là một điều tốt. Bất kỳ ngoại lệ nào mà bạn có thể tạo một lớp bên trong tĩnh là không thích hợp để tái sử dụng trong các ngữ cảnh khác cho dù bạn thực sự biến nó thành một lớp bên trong hay không.
Và đối với điểm chấm thứ hai ... "không ai khác làm điều đó" không bao giờ chịu bất cứ điều gì. Hoặc nó thực sự là điều sai trái để làm, vì vậy sẽ có những lý do khác không để làm điều đó, do đó, "không ai khác làm nó" đối số là không cần thiết. Hay không. Và nó không giống như ví dụ cụ thể này thậm chí sẽ phức tạp và khó hiểu, vì vậy thậm chí không "nó bất ngờ để mọi người sẽ gặp rắc rối sau khi nó là một ý tưởng hay về lý thuyết" đối số rất mạnh.
Có thể áp dụng cùng một câu hỏi và tùy chọn cho bất kỳ lớp học nào. Có một đặc điểm của ngoại lệ mà làm cho chúng đặc biệt thích hợp để làm tổ, hay là câu hỏi đơn giản hỏi [khi nào sử dụng các lớp lồng nhau?] (Https://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html) – jaco0646