2011-06-17 35 views
22

Trong Java 5 trước, không có chú thích. Kết quả là bạn không thể thêm siêu dữ liệu vào một lớp học.Tại sao java.io.Serializable không được chấp nhận trong Java 5?

Để đánh dấu một lớp như serializable, bạn phải thực hiện các giao diện Serializable (mà chỉ vậy, một dấu hiệu là) và sử dụng thêm transient từ khóa để đánh dấu một lĩnh vực là không serializable nếu cần thiết, một cái gì đó như:

public class MyClass implements Serializable { 
    ... 
    private transient Bla field; 
    ... 
} 

Bây giờ bạn về mặt lý thuyết có thể tận dụng các chú thích (đây là một sử dụng hoàn hảo cho họ) và có:

@Serializable 
public class MyClass { 
    ... 
    @Transient 
    private Bla field; 
    ... 
} 

Nhưng giao diện và từ khóa không được tán thành và không có chú thích đã được bổ sung trong Java 5 để thay thế chúng .

Các cân nhắc cho quyết định này để giữ giao diện và từ khóa là gì?

Tất nhiên là có vấn đề về tính tương thích với mã Java 5 trước, nhưng tại một thời điểm nào đó sẽ kết thúc (ví dụ: liên quan đến các tính năng mới của generics, JLS chỉ định rằng It is possible that future versions of the Java programming language will disallow the use of raw types). Vậy tại sao không chuẩn bị cho các chú thích được sắp xếp theo thứ tự?

Mọi suy nghĩ? (Mặc dù tôi muốn tham khảo cụ thể: D mà tôi đã không thể tìm thấy)

+0

Thông thường việc này đang được thực hiện để làm cho mã hiện có tương thích ngược. Vì vậy, bạn có thể dễ dàng nâng cấp nhưng di chuyển từng bước sang các chú thích mới. –

+0

Bạn đang tham chiếu phần nào trong JLS? – Atreys

+1

@Atreys: Cái có chứa * Có thể là các phiên bản tương lai của ngôn ngữ lập trình Java sẽ không cho phép sử dụng các kiểu thô * nhận xét – ElenaT

Trả lời

20

Giao diện là có vì vậy phương pháp có thể được định nghĩa để chấp nhận đối tượng thuộc loại Serializable:

public void registerObject(Serializable obj); 
+0

Có! Tôi hoàn toàn đồng ý với bạn. Nhưng điều này sẽ không thể thực hiện được với một cái gì đó như: ** public void registerObject (@Serializable Object obj) **? – ElenaT

+0

Bạn có thực sự muốn làm điều đó ElenaT? –

+0

@ John cũng ... tại sao không? Dòng ban đầu của Ethan sẽ làm gì tốt hơn Elena? – Jesper

2

Serializabletransient có thực sự hai thứ có thể đã được thay thế bằng chú thích.

Chúng không được chấp nhận vì có thể là của các chương trình sử dụng Serializable và sẽ gây phiền toái cho hàng triệu nhà phát triển nếu trình biên dịch đột nhiên bắt đầu phun ra hàng nghìn cảnh báo không dùng nữa.

Có rất nhiều thứ khác trong API Java chuẩn có thể đã không còn được dùng nữa - ví dụ: các lớp sưu tập cũ VectorHashtable (và tôi chắc chắn bạn có thể dễ dàng tìm thấy nhiều thứ khác). Và có những thứ khác có thể đã được triển khai bằng chú thích (ví dụ: từ khóa volatile, strictfpsynchronized).

10

Tắt tất nhiên có là vấn đề tương thích với pre Java 5 mã ...

Yes. Đây là gốc rễ của vấn đề.

  • Nếu họ @deprecated giao diện Serializable trong (nói) Java 5, sau đó rất nhiều cũ trước Java 5 mã sẽ đưa ra cảnh báo (hoặc lỗi tùy thuộc vào công tắc biên dịch).

  • Không có gì thực sự sai khi sử dụng Serializable và "buộc" mọi người thay thế nó gây phiền toái. (Mọi người có những điều tốt hơn để làm ...)

  • Khi mọi người đã "cố định" điều này trong mã của họ, nó sẽ không còn biên dịch bằng trình biên dịch Java 5 trước hoặc chạy trên JVM trước Java 5.

  • Đó là một ý tưởng tồi để làm những điều làm cho trình biên dịch có hệ thống "khóc sói".

... nhưng tại một thời điểm nào đó sẽ kết thúc.

Thực tế, cơ hội thực sự xảy ra là (IMO) nhỏ. Theo tôi biết, Sun/Oracle có không bao giờ đã xóa một tính năng không dùng nữa. Thậm chí không nguy hiểm như Thread.stop() và bạn bè.


Là chú thích, nhà phát triển Go đang sử dụng cách tiếp cận khác cho vấn đề này. Khi họ muốn thay đổi một ngôn ngữ hoặc tính năng thư viện, họ chỉ làm điều đó. Họ cung cấp một converter sẽ tự động viết lại mã của bạn theo yêu cầu.

+0

'Thread.stop (Throwable)' đã được gỡ bỏ một cách hiệu quả (luôn luôn ném 'UnsupportedOperationException') trong Java 8.' Serializable' vẫn không thể đi bất cứ đâu, tất nhiên. –

0

Ngừng sử dụng cho những thứ đang có hại. Những gì bạn đang đề xuất là bắt buộc các tác giả của tám năm mã Java hiện tại (vào thời điểm đó) để viết lại nó, không có lợi thế, chỉ để tắt cảnh báo trình biên dịch không dùng nữa, để lấy lại mã hoàn toàn chính xác mà họ đã có với Java 1.4 . Điều đó sẽ không hữu ích.

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