Tại sao package-info.java lại hữu ích?


97

Khi tôi chạy CheckStyle qua dự án Java của mình, nó cho biết Missing package-info.java file.một số lớp, nhưng không phải tất cả chúng. Tôi thực sự không thể hiểu tại sao thông báo này chỉ xuất hiện đôi khi. Hơn nữa, dự án của tôi chạy hoàn toàn tốt mà không có package-info.java.

Package-info.java làm gì? Tôi có thực sự cần nó cho các dự án Java của mình không?


3
Bạn có thể sử dụng chúng để tạo tài liệu hoặc chú thích ở cấp độ gói. Xem câu hỏi này .
McDowell

Tôi đã là một fan hâm mộ của package-info.java suốt thời gian qua nhưng tôi tự hỏi liệu README.md có phù hợp hơn vào năm 2018 hay không
Sridhar Sarnobat

@ Sridhar-Sarnobat Bên cạnh package-info.java và README.md từ Git, có khả năng Confluene cũng có thể thêm vé Jira. Bằng cách đó, sơ đồ, quy trình làm việc hoặc video cũng có thể được thêm vào.
Socrates

1
Bạn có biết rằng bạn cũng có thể viết mã khác trong đó không? Giống như các lớp học vv ... Kỳ lạ!
spketboy

Câu trả lời:


106

Nó được sử dụng để tạo javadocs cho một gói.

/**
* Domain classes used to produce .....
* <p>
* These classes contain the ......
* </p>
*
* @since 1.0
* @author somebody
* @version 1.0
*/
package com.domain;

Sẽ tạo thông tin com.domaingói cho gói:

Kết quả ví dụ: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html


xin lỗi vẫn không rõ bạn tham khảo phần nào có phải Example resultlà readme.md không?
shareef

50

Chú thích

Một lý do tốt khác để sử dụng package-info.java là thêm các chú thích mặc định để FindBugs sử dụng . Ví dụ: nếu bạn đưa thông tin này vào tệp thông tin gói của mình:

@DefaultAnnotation(NonNull.class)
package com.my.package;

thì khi findbugs chạy trên mã trong gói đó, tất cả các phương thức và trường được giả định là khác rỗng trừ khi bạn chú thích chúng bằng @CheckForNull. Điều này đẹp hơn và dễ hiểu hơn nhiều so với việc yêu cầu các nhà phát triển thêm @NonNullchú thích vào từng phương thức và trường.


12

Không chỉ một số chú thích của findbugs, mà rất nhiều chú thích java trong các thư viện thông thường có java.lang.annotation.ElementType.PACKAGEkiểu là một trong những giá trị có thể có của java.lang.annotation.Targetchú thích riêng của chúng , ví dụ:

com.google.gwt.core.client.js.JsNamespace
com.querydsl.core.annotations.Config
com.sun.xml.bind.XmlAccessorFactory
groovy.transform.BaseScript
java.lang.Deprecated
javax.annotation.Generated
javax.xml.bind.annotation.XmlAccessorOrder
org.hibernate.annotations.TypeDef
net.sf.ehcache.pool.sizeof.annotations.IgnoreSizeOf
org.apache.hive.common.HiveVersionAnnotation
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeAction
org.codehaus.commons.nullanalysis.NotNullByDefault
org.eclipse.persistence.oxm.annotations.XmlNameTransformer
org.glassfish.jersey.Beta
org.jgroups.annotations.Experimental

và nhiều hơn nữa.

Đây package-info.javatập tin sẽ là tập tin, nơi bạn có thể đặt chú thích như vậy (cùng với javadoc).



4

Các package-info.java là một file Java có thể được thêm vào bất kỳ gói mã nguồn Java. Nó được sử dụng để cung cấp thông tin ở cấp độ "gói" theo tên của nó. Nó chứa tài liệu và chú thích được sử dụng trong gói.

Ví dụ javadoc đã được cung cấp trong câu trả lời, phần bên dưới giải thích cách nó hoạt động khi có chú thích.

Ví dụ: trong tệp dưới đây, nó được sử dụng để "thay thế" sự xuất hiện của joda.time.DateTime bằng org.jadira.usertype.dateandtime.joda.PersistingDateTime

@TypeDefs({
    @TypeDef(name = "PersistentDateTime", typeClass = PersistentDateTime.class, defaultForType=DateTime.class)})

package xyz.abc;

import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.jadira.usertype.dateandtime.joda.PersistentDateTime;
import org.joda.time.DateTime; 

Có một số chú thích có sẵn có thể được sử dụng để thực hiện những việc khác nhau ở cấp độ "gói". Nó có thể được tìm thấy tại https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.