2013-04-22 18 views
13

Tôi đã tình cờ đi qua mã nguồn của các lớp lõi Java. Tôi thấy rằng tệp Process.java là lớp học public abstract. Khi tôi đã đi qua mã Không có chức năng có định nghĩa. Điều đó có nghĩa là nó phải được khai báo là Interface. Có lý do cố ý nào đằng sau nó không. Có thể một số giúp tôi hiểu được nhu cầu thiết kế như vậy.Không thể hiểu cần làm cho Process.java trừu tượng

Liên kết đến code

+0

Một số người nói rằng giao diện đại diện cho mối quan hệ "có một" và kế thừa đại diện cho mối quan hệ "là-a". Tác giả ban đầu của Process.java có thể tin rằng những người thực hiện Process sẽ * là một tiến trình, chứ không phải chỉ đơn giản là _having_ một tiến trình. – Eric

+2

[câu hỏi] liên quan này (http://stackoverflow.com/q/761194/1225328) có một câu trả lời thú vị [http://stackoverflow.com/a/10026391/1225328). – sp00m

+0

Đó là vì nó được. Không xây dựng. – EJP

Trả lời

0

Theo tài liệu của java.lang.Process, lớp cung cấp một constructor có thể được gọi là không có đối số. Giao diện không thể làm điều đó.

+0

Nó chỉ có một hàm tạo mặc định. Làm thế nào là hữu ích? – Eugene

+0

Và hàm tạo mặc định này phải tồn tại, hoặc được tạo bởi trình biên dịch java hoặc được mã hóa bởi nhà phát triển. Nếu 'java.lang.Process' là một giao diện, thì không có hàm tạo mặc định nào có thể tồn tại. – Oswald

+1

@Oswald Dù sao, đây là hàm tạo mặc định thậm chí không được triển khai trong lớp (nhờ vào liên kết của OP). Tôi đoán việc tạo ra JavaDoc tự động thêm nó mà không có quy định rõ ràng. Tôi không chắc đây là vấn đề. – sp00m

2

tôi nghi ngờ sự khác biệt quan trọng nảy sinh từ thực tế là bạn có thể implement như nhiều interface s như bạn muốn nhưng bạn chỉ extendmộtclass thể, có thể là trừu tượng hay không.

Làm cho Process do đó đảm bảo rằng nếu bạn thực sự quyết định tạo từ đầu (nghĩa là không phải từ nhà máy do hệ thống cung cấp, đó là tuyến đường bình thường), bạn sẽ không thể đặt chức năng trong lớp cha của nó. Điều đó giúp tôi không chắc chắn.

Có thể đó là điều bảo mật vì các quy trình được cho là do hệ điều hành tạo và sở hữu. Nó đang làm tốt nhất là ngăn cản bạn tự làm cho mình.

Added

sâu xuống Tôi nghĩ lý do nó không phải là một giao diện là lịch sử. Hãy nhớ rằng Process đã ở trong số java.lang kể từ năm chấm và sau đó giao diện là thứ bạn triển khai, chứ không phải định nghĩa về khía cạnh của tính cách của đối tượng. Khái niệm đó đã lớn lên nhiều sau đó.

Lưu ý rằng Process đã có từ JDK 1.0 trong khi nhiều giao diện hữu ích hơn đến sau này, ví dụ giao diện CharSequence không xuất hiện cho đến JDK 1.4. Tôi nghĩ rằng có một sự thay đổi mô hình từ các đối tượng là chính và giao diện thực sự hữu ích cho các giao diện là tất cả và kết thúc tất cả trong khi các đối tượng chỉ thực hiện.

Process do đó sẽ là một trong những lớp được tạo ra vào thời điểm đó khi một Process là một đối tượng thực và có lẽ đã lái một chiếc Audi Quattro, không phải một số danh nghĩa điều miasmic mơ hồ kiểu sức có một số phương pháp trong đó và trông hơi giống thế này

3

Process là trừu tượng vì có thể có triển khai khác nhau trên mỗi hệ điều hành. Các nhà phát triển ứng dụng không triển khai lớp trừu tượng này; nó được thực hiện như một phần của thời gian chạy Java.

Vì tất cả các phương thức đều trừu tượng, nó có thể được khai báo là một giao diện, nhưng điều đó sẽ làm cho lớp không thể phát triển trong tương lai. Ví dụ, các phương thức mới không nên được thêm vào một giao diện khi nó được khai báo trong một API công cộng, bởi vì sau đó mọi triển khai hiện có sẽ không tương thích. Ngược lại, một phương thức mới (cụ thể) có thể dễ dàng được thêm vào một lớp trừu tượng.

Các trường hợp Process được tạo bởi thời gian chạy, hoặc thông qua phương thức lớp học Runtime hoặc từ ví dụ ProcessBuilder.Các ứng dụng thường sẽ không sử dụng toán tử new để tạo một cá thể (của lớp con cụ thể) trực tiếp.

+0

+1, tôi chỉ không hiểu lý do thêm phương thức cụ thể vào Quy trình. Mọi tiến trình mở rộng của mọi người vẫn sẽ triển khai cùng một phương thức trừu tượng, thậm chí họ có thể không nhận ra có một phương pháp cụ thể. – Eugene

+0

@Eugene Nếu bạn định nghĩa một giao diện, và ai đó thực hiện nó, thì bạn thay đổi giao diện, việc triển khai của chúng bị hỏng. Chúng không thể biên dịch lại được, vì nó không tương thích nguồn và nếu ai đó sử dụng phiên bản cũ được biên dịch trước đó, chúng sẽ nhận được 'IncompatibleClassChangeError' hoặc' NoSuchMethodError'. Mặt khác, nếu bạn sử dụng một lớp trừu tượng, và sau đó thêm một phương thức cụ thể, những người mở rộng lớp đó không phải làm bất cứ điều gì. Mã cũ của họ tiếp tục hoạt động tốt. – erickson

+0

Vâng, sau khi kiểm tra nguồn tôi thấy bạn đúng - có một lớp ProcessImpl riêng biệt (cuối cùng) cho mỗi nền tảng. –

1

Lớp học Process rõ ràng không có chức năng nội bộ mà chúng tôi không thể nhìn thấy và điều này phải phụ thuộc vào hệ điều hành, vì lý do hiển nhiên.

Tôi đoán là họ không muốn bạn triển khai các lớp của riêng bạn tuân theo API không kế thừa chức năng ẩn của thư viện Java được xác định Lớp quy trình.

+0

Bingo! 'Process' phải là một lớp vì có chức năng nội bộ liên kết với nó, và với một giao diện sẽ không có bất cứ thứ gì" thực "bên dưới nó. –

+0

Làm thế nào là nó rõ ràng rằng lớp 'Process' có chức năng nội bộ? Có thể chức năng nội bộ này không được thực hiện trong lớp dẫn xuất? – Oswald

+0

@Oswald - Làm thế nào để các coder của lớp dẫn xuất biết những gì cần thực hiện, và làm thế nào ông có thể truy cập các giao diện nội bộ cần thiết để làm điều đó? –

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