2017-09-18 14 views
15

Các Modifier for Exports trong doc java khẳng định rằnglà gì chênh lệch giữa tổng hợp và Modifier uỷ thác trong Java9

MANDATED Việc xuất khẩu đã ngầm tuyên bố trong nguồn của module khai.

SYNTHETIC Xuất không được khai báo rõ ràng hoặc ngầm định trong nguồn khai báo mô-đun .

Nhìn vào vài module-info.class es, tôi có thể thấy rằng có chung hai loại tập quán:

module java.base { 
    ... 
    exports java.util; // type 1 
    exports java.util.concurrent; 
    exports java.util.concurrent.atomic; 
    exports jdk.internal to jdk.jfr; // type 2 
    exports jdk.internal.jmod to 
     jdk.compiler, 
     jdk.jlink; 
    ... 
} 

Các Qualified Exports làm mô tả hai loại nhưng không có tài liệu tham khảo cho các loại enum. Đây có phải là các loại khác nhau được đề cập trong tài liệu không?

Q1. Nói chung, SYNTHETICMANDATED là các công cụ sửa đổi được sử dụng như trong Exports, ModuleDescriptor, OpensRequires. Sự khác nhau giữa hai loại này và cái nào được ưa thích hơn cái khác trong thực tế?

Q2. Ví dụ về số SyntheticModifier, nếu không được khai báo trong nguồn của mô-đun thì sao?

+2

Không phải bạn là người trả lời những câu hỏi này? ;-) – GhostCat

+0

@GhostCat Haha..Tôi sẽ cố gắng hết mình cho cái này tôi đoán.Chỉ cần không thể tìm thấy một tài liệu tham khảo đơn giản ở bất cứ đâu. Hãy dựa vào cộng đồng để trở lại với một số chi tiết tốt hơn :) – nullpointer

+1

Chúng ta hãy chờ Alan trả lời câu hỏi này nhưng tôi đoán rằng xuất khẩu tổng hợp có thể là những thứ được tạo cho các mô-đun tự động và mô-đun chưa được đặt tên. Các mô đun này xuất khẩu các gói mặc dù chúng không khai báo mệnh đề 'exports'. Nhưng tôi thực sự chỉ đoán ở đây ... – Nicolai

Trả lời

1

Sự khác biệt trong các công cụ sửa đổi tổng hợp và bắt buộc là đơn giản - ủy nhiệm được khai báo hoàn toàn và tổng hợp không được khai báo hoàn toàn hoặc rõ ràng. Có những bài viết hay về điều đó và đặc điểm kỹ thuật java đã giải thích chi tiết về công cụ sửa đổi tổng hợp đã được giới thiệu trước đó cho java. Dưới đây chi tiết liên quan đến tổng hợp được trích xuất từ ​​những người vì sự đầy đủ của các chi tiết. Xin vui lòng tìm các tài liệu tham khảo ở cuối.

tổng hợp:

Thuộc tính tổng hợp là một thuộc tính cố định chiều dài trong các thuộc tính bảng của một ClassFile, field_info, hoặc cấu trúc method_info (§4.1, §4.5, §4.6). Thành viên của lớp không xuất hiện trong mã nguồn phải được đánh dấu bằng thuộc tính Tổng hợp, nếu không thành viên đó phải có bộ cờ ACC_SYNTHETIC của nó. Ngoại lệ duy nhất cho yêu cầu này là phương pháp tạo trình biên dịch không được coi là triển khai hiện vật, cụ thể là phương thức khởi tạo thể hiện một hàm dựng mặc định của ngôn ngữ lập trình Java (§2.9), lớp khởi tạo (§2.9), và các phương thức Enum.values ​​() và Enum.valueOf() . Các lớp, các phương thức và các lớp tổng hợp Java là dành cho các mục đích nội bộ của thời gian chạy java . Chúng tôi có thể không cần phải có kiến ​​thức về họ để viết mã.

Thuộc tính Tổng hợp được giới thiệu trong bản phát hành JDK 1.1 để hỗ trợ các lớp và giao diện lồng nhau.

Thuộc tính tổng hợp có định dạng sau:

Synthetic_attribute { 
    u2 attribute_name_index; 
    u4 attribute_length; 
} 

Các mặt hàng của cấu trúc Synthetic_attribute như sau:

attribute_name_index Giá trị của mặt hàng đó attribute_name_index phải là một chỉ số có giá trị vào bảng constant_pool . Mục nhập hằng số_pool tại chỉ mục đó phải là cấu trúc CONSTANT_Utf8_info (§4.4.7) đại diện cho chuỗi "Tổng hợp".

attribute_length Giá trị của mục attribute_length bằng 0. Sử dụng của Java tổng hợp • Nó có thể hữu ích trong việc gỡ lỗi phiên, khi chúng tôi xem những thứ tổng hợp trong theo dõi ngăn xếp chúng ta có thể hiểu nó là gì. • AOP, generics, enums sử dụng Java tổng hợp. • API phản chiếu Java hiển thị phương pháp để kiểm tra xem một phần tử có phải là tổng hợp hay không. • Một lập trình viên ứng dụng java thường xuyên sẽ không yêu cầu tổng hợp hàng ngày lập trình. • Kiến thức này có thể được yêu cầu trong các cuộc phỏng vấn nhưng không yêu cầu bạn sẽ sử dụng nó trong dự án. Khi tổng hợp là được tạo? Khi một lớp kèm theo truy cập một thuộc tính riêng của một lớp lồng nhau là , trình biên dịch Java tạo ra phương thức tổng hợp cho thuộc tính đó. Nếu có một phương thức getter có sẵn trong nguồn thì phương thức tổng hợp này sẽ không được tạo ra. Tương tự như vậy đối với hàm tạo của các lớp bên trong cũng tổng hợp được tạo ra. Có rất nhiều trường hợp, như thế này khi một trường hoặc phương thức hoặc lớp tổng hợp được tạo ra.

uỷ thác:

Các mở gói đã ngầm tuyên bố trong nguồn của module khai. Sự phụ thuộc này đã được khai báo trong khai báo mô-đun. A cấu trúc bắt buộc là cấu trúc không được khai báo rõ ràng trong mã nguồn , nhưng có sự hiện diện được ủy quyền theo đặc tả. một cấu trúc được cho là được khai báo hoàn toàn. Một ví dụ về phần tử bắt buộc là một hàm tạo mặc định trong một lớp không chứa khai báo rõ ràng về hàm tạo của . Một ví dụ khác về cấu trúc được yêu cầu là chú thích vùng chứa được khai báo ngầm được sử dụng để giữ nhiều chú thích của loại chú thích có thể lặp lại. Ví dụ:

Module claim 
requires mandated java.base 

Dòng 1. Xác định mô-đun được gọi là xác nhận quyền sở hữu. Trong dòng 2 xác định mọi mô-đun phụ thuộc vào mô-đun java.base ngoại trừ java.base. Điều đó có nghĩa là xuất khẩu đã được khai báo hoàn toàn trong khai báo mô-đun nguồn.

Tài liệu tham khảo:

+0

Hey! Chào mừng bạn đến với stackoverflow và cảm ơn vì đã đặt nhiều nỗ lực này vào việc trả lời câu hỏi này. Yêu cầu nhỏ, bạn có thể vui lòng liên kết tài liệu bạn đã giải quyết và cải thiện định dạng của câu trả lời. Điều đó sẽ làm tăng khả năng đọc của nó. – nullpointer

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