ทำไม package-info.java จึงมีประโยชน์?


97

เมื่อฉันเรียกใช้ CheckStyle บนโปรเจ็กต์ Java ของฉันมันบอกMissing package-info.java file.สำหรับบางคลาส แต่ไม่ใช่ทั้งหมด ฉันคิดไม่ออกจริงๆว่าทำไมข้อความนี้จึงปรากฏขึ้นเป็นบางครั้ง นอกจากนี้โครงการของฉันยังทำงานได้ดีอย่างสมบูรณ์โดยไม่มี package-info.java

package-info.java ทำอะไร? ฉันต้องการมันสำหรับโปรเจ็กต์ Java ของฉันหรือไม่?


3
คุณสามารถใช้เพื่อจัดทำเอกสารหรือใส่คำอธิบายประกอบในระดับแพ็คเกจ ดูคำถามนี้
McDowell

ฉันเป็นแฟนตัวยงของ package-info.java มาตลอด แต่ฉันสงสัยว่า README.md เหมาะสมกว่าในปี 2018 หรือไม่
Sridhar Sarnobat

@ Sridhar-Sarnobat นอกจาก package-info.java และ README.md จาก Git แล้วยังมีความเป็นไปได้ที่ Confluene อาจเพิ่มตั๋ว Jira ด้วย วิธีนี้ยังอาจเพิ่มไดอะแกรมเวิร์กโฟลว์หรือวิดีโอ
Socrates

1
คุณรู้ไหมว่าคุณสามารถเขียนโค้ดอื่น ๆ ได้ด้วย? ชอบเรียน ฯลฯ ... แปลก!
sproketboy

คำตอบ:


106

ใช้ในการสร้าง javadocs สำหรับแพ็คเกจ

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

จะสร้างข้อมูลcom.domainแพ็คเกจสำหรับแพ็คเกจ:

ตัวอย่างผลลัพธ์: https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html


ขออภัยยังไม่ชัดเจนว่าส่วนใดที่คุณอ้างถึงExample resultคือ readme.md?
แชร์เมื่อ

50

คำอธิบายประกอบ

อีกเหตุผลที่ดีที่จะใช้ package-info.java คือการเพิ่มค่าเริ่มต้นคำอธิบายประกอบสำหรับการใช้งานโดยFindBugs ตัวอย่างเช่นหากคุณใส่สิ่งนี้ไว้ในไฟล์ข้อมูลแพ็คเกจของคุณ:

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

แล้วเมื่อ FindBugs วิ่งบนรหัสในแพคเกจนั้นวิธีการทั้งหมดและสาขาจะถือว่าเป็น null @CheckForNullไม่ใช่จนกว่าคุณจะใส่คำอธิบายประกอบพวกเขาด้วย สิ่งนี้ดีกว่าและเข้าใจผิดได้มากกว่าการกำหนดให้นักพัฒนาเพิ่ม@NonNullคำอธิบายประกอบให้กับแต่ละวิธีการและฟิลด์


12

ไม่เพียง แต่คำอธิบายประกอบ findbugs บางส่วนเท่านั้น แต่คำอธิบายประกอบ java จำนวนมากในไลบรารีทั่วไปยังมีjava.lang.annotation.ElementType.PACKAGEประเภทเป็นหนึ่งในค่าที่เป็นไปได้ของjava.lang.annotation.Targetคำอธิบายประกอบของตัวเองเช่น:

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

และอื่น ๆ อีกมากมาย

package-info.javaไฟล์นี้จะเป็นไฟล์ที่คุณสามารถใส่คำอธิบายประกอบดังกล่าวได้ (พร้อมกับ javadoc)


7

ไฟล์ package-info.java อนุญาตให้เพิ่ม javadoc เพื่อจัดทำเอกสารทั้งแพ็กเกจ ดูตัวอย่างhttp://docs.oracle.com/javase/7/docs/api/java/applet/package-summary.html

หากคุณไม่สนใจเกี่ยวกับเอกสารหายแพคเกจแล้วไม่สนใจคำเตือนหรือปิดใช้งานการตรวจสอบ JavadocPackage


4

package-info.javaเป็นไฟล์ Java ที่สามารถเพิ่มแพคเกจใด ๆ แหล่ง Java ใช้เพื่อให้ข้อมูลในระดับ "แพ็คเกจ" ตามชื่อ ประกอบด้วยเอกสารประกอบและคำอธิบายประกอบที่ใช้ในแพ็คเกจ

ตัวอย่าง javadoc มีให้แล้วในคำตอบส่วนด้านล่างอธิบายวิธีการทำงานในกรณีของคำอธิบายประกอบ

ตัวอย่างเช่นในไฟล์ด้านล่างจะใช้เพื่อ "แทนที่" การเกิดขึ้นของ joda.time.DateTime ด้วย org.jadira.usertype.dateandtime.joda.PersistentDateTime

@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; 

มีคำอธิบายประกอบจำนวนมากที่สามารถใช้เพื่อดำเนินการต่างๆในระดับ "แพ็กเกจ" สามารถดูได้ที่https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/package-summary.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.