ตัวอย่างรหัสหลายบรรทัดในความคิดเห็น Javadoc


531

ฉันมีตัวอย่างรหัสขนาดเล็กที่ฉันต้องการรวมในความคิดเห็น Javadoc สำหรับวิธีการ

/**
 * -- ex: looping through List of Map objects --
 * <code>
 * for (int i = 0; i < list.size(); i++) {
 *      Map map = (Map)list.get(i);
 *      System.out.println(map.get("wordID"));
 *      System.out.println(map.get("word"));
 * }
 * </code>
 * 
 * @param query - select statement
 * @return List of Map objects
 */

ปัญหาคือตัวอย่างรหัสปรากฏขึ้นใน Javadoc โดยไม่มีการขึ้นบรรทัดใหม่ทำให้อ่านยาก

-- ex: looping through List of Map objects -- for (int i = 0; i list.size(); i++) { Map map = (Map)list.get(i); System.out.println(map.get("wordID")); System.out.println(map.get("word")); } 
Parameters
query - - select statement 
Returns:
List of Map objects 

ฉันเดาว่าฉันคิดผิดว่าการแท็กรหัสจะจัดการกับการขึ้นบรรทัดใหม่ วิธีที่ดีที่สุดในการจัดรูปแบบตัวอย่างรหัสในความคิดเห็น Javadoc คืออะไร?

คำตอบ:


743

นอกจาก<pre>แท็กที่กล่าวถึงแล้วคุณควรใช้@codeคำอธิบายประกอบ JavaDoc ซึ่งจะทำให้ชีวิตง่ายขึ้นมากเมื่อมันมาถึงปัญหาเอนทิตี HTML (โดยเฉพาะกับ Generics) เช่น:

* <pre>
* {@code
* Set<String> s;
* System.out.println(s);
* }
* </pre>

จะให้ผลลัพธ์ HTML ที่ถูกต้อง:

Set<String> s;
System.out.println(s);

ในขณะที่ละเว้นการ@codeบล็อก (หรือใช้<code>แท็ก) จะส่งผลให้ HTML เช่นนี้:

Set s;
System.out.println(s);

(สำหรับการอ้างอิงคำอธิบายแท็ก Java SE 8 สามารถพบได้ที่นี่: แท็ก Javadoc )


63
ฉันก็คิดเช่นกัน แต่โชคไม่ดีที่คุณยังต้องเพิ่มแท็ก <pre> เพื่อให้ได้ตัวแบ่งบรรทัด
Fabian Steeg

12
น่าเสียดายที่ดูเหมือนว่าเมื่อคุณกด ctrl + shift + F (โค้ดรูปแบบใน Eclipse) Eclipse ทำให้แท็ก {@code} ยุ่งและแทนที่ด้วย {& # 064; รหัส ...
jpdaigle

3
@ jpdaigle ฉันลองใน Eclipse Galileo และ Helios และฟอร์แมตเตอร์ไม่ได้แทนที่อะไรสำหรับฉัน (บน Mac OS แต่ฉันไม่เคยเห็นฟอร์แมตเตอร์ทำอะไรเช่นนั้นบนแพลตฟอร์มอื่นเช่นกัน)
Fabian Steeg

30
โชคร้ายอีกอย่างหนึ่งถ้าคุณมีบล็อคในโค้ดตัวอย่างของคุณโดยใช้เครื่องหมายปีกกา "{}" การปิดวงเล็บครั้งแรกจะยุติการบล็อก @code อีกวิธีหนึ่งคือการใช้ (รอให้มัน ... ) หน่วยงาน HTML สำหรับวงเล็บปีกกา ฉันไม่เห็นข้อโต้แย้งที่น่าสนใจสำหรับแท็ก <pre> สำหรับรหัสที่มีบล็อก
Ed Griebel

2
Eclipse ทำให้แท็ก {@code} ยุ่งเหยิงและแทนที่ด้วย {& # 064; code- นี่ไม่ใช่เพราะ Eclipse นี่เป็นเพราะยูทิลิตี้ javadoc (bugged?) หากคุณมีอักขระ @ ในรหัสหลายบรรทัดภายใน {@ รหัส ... หลายบรรทัด ... } จากนั้น javadoc ไม่สามารถแยกวิเคราะห์ได้อย่างถูกต้อง :( อย่างน้อยนี่คือสิ่งที่ฉันเห็นด้วยการใช้งาน Oracle JDK1.7.0_45 javadoc
ชาย

167

ฉันมีช่วงเวลาที่ยากลำบากด้วยการรวมตัวอย่างรหัสเฉพาะในความคิดเห็น javadoc ฉันต้องการแชร์สิ่งนี้
โปรดทราบสิ่งต่อไปนี้:

  • การใช้<code>แท็กเก่าเพื่อป้องกันไม่ให้มีการตีความวงเล็บปีกกา
  • การใช้งานของ "ใหม่" {@code ...}- แท็กเพื่อรับข้อมูลทั่วไปรวมอยู่ในการส่งออก
  • การหลีกเลี่ยงการลงชื่อเข้าใช้ @ @Overrideผ่านทาง " {@literal @}Override" เนื่องจากตัวสร้าง javadoc "เอียง" ที่นั่นเนื่องจากข้อเท็จจริงที่ว่า @ ไปโดยตรงหลังจากวงเล็บปีกกาเปิด
  • ลบช่องว่างด้านหน้า{@codeและ{@literalเพื่อชดเชยช่องว่างด้านในและรักษาแนวร่วม

รหัส javadoc:

/** this methods adds a specific translator from one type to another type. `
  * i.e.
  * <pre>
  * <code>new BeanTranslator.Builder()
  *   .translate(
  *     new{@code Translator<String, Integer>}(String.class, Integer.class){
  *      {@literal @}Override
  *       public Integer translate(String instance) {
  *         return Integer.valueOf(instance);
  *       }})
  *   .build();
  * </code>
  * </pre>
  * @param translator
  */

ได้รับการพิมพ์เป็น

new BeanTranslator.Builder()
  .translate(
    new Translator<String, Integer>(String.class, Integer.class){
      @Override
      public Integer translate(String instance) {
        return Integer.valueOf(instance);
      }})
  .build();

2
ใช้งานได้ แต่ฉันได้รับคำเตือนเมื่อเรียกใช้ javadoc กำลังแสดงผลคำเตือน "คำเตือน: {@code} ภายใน <code>"
Shane Rowatt

3
นี่เป็นคำตอบที่ทำงานได้ดีคำตอบที่ยอมรับใช้ไม่ได้กับ eclipse ของฉัน (4.6.2)
Eric Wang

ฉันสงสัยว่าทำไมทั้งหมดนี้จึงจำเป็น Intellij 13 ของฉันและทำงานในภายหลังได้ดีกับรหัสในคำตอบที่ยอมรับได้ นี่เป็นเพียงปัญหาคราสหรือไม่
bvdb

ใช่ฉันเคยเห็นงานนี้ดีใน IntelliJ 11 และใหม่กว่า IntelliJ จัดการได้อย่างถูกต้อง น่าเสียดายที่ Eclipse ไม่แสดงผล JavaDoc อย่างถูกต้อง (สถานะโฮเวอร์) และละเว้นบรรทัดใหม่และตัวแบ่ง html ฉันพยายามหาวิธีแก้ปัญหาที่ใช้งานได้ดีกับ IDE ทั้งสองเนื่องจากเป็นสอง IDE อันดับต้น ๆ ที่ใช้กันอยู่ในปัจจุบัน
Michael M

41

ซอร์ส java มีตัวอย่างที่ดีมากมายสำหรับสิ่งนี้ นี่คือตัวอย่างจากส่วนหัวของ "String.java":

....
 * is equivalent to:
 * <p><blockquote><pre>
 *     char data[] = {'a', 'b', 'c'};
 *     String str = new String(data);
 * </pre></blockquote><p>
 * Here are some more examples of how strings can be used:
 * <p><blockquote><pre>
 *     System.out.println("abc");
 *     String cde = "cde";
 *     System.out.println("abc" + cde);
 *     String c = "abc".substring(2,3);
 *     String d = cde.substring(1, 2);
 * </pre></blockquote>
...

9
โดยสรุป<pre><blockquote>...</blockquote></pre>
Jin Kwon

6
ค่อนข้าง<p><blockquote><pre> </pre></blockquote></p>
masterxilo

@JinKwon น่าเศร้าที่นี่ไม่ทำงานเสมอไม่ใช่ในรหัสของฉัน :( เพิ่ม {@ รหัสที่จุดเริ่มต้นการทำงานแม้ว่าการปิด} จะไม่สามารถเข้าถึงได้
benez

นี้จะปรากฏขึ้นในการทำงานสำหรับรหัสมากที่สุด List<String>แต่ไม่ได้หลบหนีวงเล็บมุมเช่น <pre>{@code ... }</pre>สำหรับการที่ผมใช้
แดเนียล


14

คุณต้องการ<pre></pre>แท็กสำหรับการขึ้นบรรทัดใหม่และ{@code ... }ด้านในจะเป็นชื่อทั่วไป แต่ไม่อนุญาตให้วางวงเล็บปีกกาเปิดในบรรทัดเดียวกันกับ<generic>แท็กเพราะทุกอย่างจะปรากฏบน 1 บรรทัดอีกครั้ง

แสดงในหนึ่งบรรทัด:

* ..
* <pre>
* {@code
* public List<Object> getObjects() {
*    return objects;
* }
* </pre>
* ..

แสดงด้วยตัวแบ่งบรรทัด:

* ..
* <pre>
* {@code
* public List<Object> getObjects() 
* {
*    return objects;
* }
* </pre>
* ..

อีกสิ่งที่แปลกคือเมื่อคุณวางวงเล็บปีกกาปิดของ{@codeมันจะได้รับการแสดง:

* ..
* <pre>
* {@code
*   public List<Object> getObjects() 
*   {
*     return objects;
*   }
* }
* </pre>
* ..

เอาท์พุท:

public List<Object> getObjects() 
{
   return objects;
}
}

4
ยินดีต้อนรับสู่ Stack Overflow เพื่อจัดรูปแบบรหัสในโพสต์คุณสามารถนำหน้ามัน (ในย่อหน้าที่แยกต่างหาก) โดยสี่ช่องว่างหรือล้อมรอบพวกเขาโดย backticks (`` ...``) คุณไม่ต้องการ<code>และ<pre>แท็ก ฉันแก้ไขคำตอบของคุณในใจนี้
Paŭlo Ebermann

10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/> จำเป็นสำหรับการรักษาเส้น
  • {@code จะต้องมีสายของตัวเอง
  • <blockquote/> เป็นเพียงการเยื้อง
public Foo(final Class<?> klass) {
    super();
    this.klass = klass;
}


อัปเดตด้วย JDK8

ความต้องการขั้นต่ำสำหรับรหัสที่เหมาะสมและ<pre/>{@code}

/**
 * test.
 *
 * <pre>{@code
 * <T> void test(Class<? super T> type) {
 *     System.out.printf("hello, world\n");
 * }
 * }</pre>
 */

อัตราผลตอบแทน

 <T> void test(Class<? super T> type) {
     System.out.printf("hello, world\n");
 }

และตัวเลือกโดยรอบ<blockquote/>แทรกการเยื้อง

/**
 * test.
 *
 * <blockquote><pre>{@code
 * <T> void test(Class<? super T> type) {
 *     System.out.printf("hello, world\n");
 * }
 * }</pre></blockquote>
 */

อัตราผลตอบแทน

     <T> void test(Class<? super T> type) {
         System.out.printf("hello, world\n");
     }

การแทรก<p>หรือล้อมรอบด้วย<p>และ</p>ให้คำเตือน


5

ฉันสามารถสร้างไฟล์ HTML ที่ดูดีด้วย snip ต่อไปนี้ซึ่งแสดงในรหัส 1

 * <pre>
 * {@code
 * A-->B
 *  \
 *   C-->D
 *    \   \
 *     G   E-->F
 * }
 *</pre>

(รหัส 1)

รหัส 1 กลายเป็นหน้า javadoc HTML ที่สร้างขึ้นในรูปที่ 1 ตามที่คาดไว้

A-->B
 \
  C-->D
   \   \
    G   E-->F

(รูปที่ 1)

อย่างไรก็ตามใน NetBeans 7.2 หากคุณกด Alt + Shift + F (เพื่อทำการฟอร์แมตไฟล์ปัจจุบัน) รหัส 1 จะเปลี่ยนเป็นรหัส 2

 * <
 * pre>
 * {@code
 * A-->B
 *  \
 *   C-->D
 *    \   \
 *     G   E-->F
 * }
 * </pre>

(รหัส 2)

ที่แรก<pre>คือตอนนี้แบ่งออกเป็นสองบรรทัด โค้ด 2 สร้างไฟล์ javadoc HTML ดังที่แสดงในรูปที่ 2

< pre> A-->B \ C-->D \ \ G E-->F

(รูปที่ 2)

คำแนะนำของ Steve B (รหัส 3) ดูเหมือนจะให้ผลลัพธ์ที่ดีที่สุดและยังคงอยู่ในรูปแบบตามที่คาดไว้แม้หลังจากกดปุ่ม Alt + Shift + F

*<p><blockquote><pre>         
* A-->B
*  \
*   C-->D
*    \   \
*     G   E-->F
* </pre></blockquote>

(รหัส 3)

การใช้ Code 3 จะสร้างเอาต์พุต javadoc HTML แบบเดียวกันดังแสดงในรูปที่ 1


4

นี่คือสองเซ็นต์ของฉัน

ในฐานะที่เป็นคำตอบอื่น ๆ แล้วรัฐคุณควรใช้ร่วมกับ<pre> </pre>{@code }

ใช้preและ{@code}

  • ห่อโค้ดของคุณไว้ด้านใน<pre>และ</pre>ป้องกันไม่ให้โค้ดของคุณยุบลงในหนึ่งบรรทัด
  • ตัดรหัสของคุณภายใน{@code }ป้องกัน<, >และทุกสิ่งในระหว่างจากหายไป สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อโค้ดของคุณมีนิพจน์ทั่วไปหรือแลมบ์ดา

ปัญหาเกี่ยวกับคำอธิบายประกอบ

ปัญหาอาจเกิดขึ้นเมื่อบล็อคโค้ดของคุณมีหมายเหตุประกอบ นั่นอาจเป็นเพราะเมื่อ@เข้าสู่ระบบจะปรากฏขึ้นที่จุดเริ่มต้นของเส้น Javadoc ก็ถือว่าเป็นแท็ก Javadoc เหมือนหรือ@param @returnตัวอย่างเช่นรหัสนี้สามารถแยกวิเคราะห์ไม่ถูกต้อง:

/**
 * Example usage:
 *
 * <pre>{@code
 * @Override
 * public void someOverriddenMethod() {

รหัสด้านบนจะหายไปอย่างสมบูรณ์ในกรณีของฉัน

ในการแก้ไขปัญหานี้บรรทัดต้องไม่ขึ้นต้นด้วย@เครื่องหมาย:

/**
 * Example usage:
 *
 * <pre>{@code  @Override
 * public int someMethod() {
 *     return 13 + 37;
 * }
 * }</pre>
 */

โปรดทราบว่ามีช่องว่างสองช่องระหว่าง@codeและ@Overrideเพื่อให้สิ่งต่าง ๆ สอดคล้องกับบรรทัดถัดไป ในกรณีของฉัน (ใช้ Apache Netbeans) มันแสดงผลอย่างถูกต้อง


3

มีความแตกต่างอย่างมีนัยสำคัญระหว่าง<blockquote><pre>...และ<pre>{@code....อดีตจะละเว้นการประกาศประเภทใน generics แต่หลังจะเก็บไว้

E.g.: List<MyClass> myObject = null; แสดงเช่นเดียวList myObject = null;กับ firts และเช่นเดียวList<MyClass> myObject = null;กับที่สอง


2

หากคุณเป็นนักพัฒนา Android คุณสามารถใช้:

<pre class=”prettyprint”>

TODO:your code.

</pre>

หากต้องการพิมพ์โค้ดของคุณใน Javadoc ด้วยโค้ด Java


1
โปรดอธิบาย: เครื่องมืออะไรของ Android ที่จะใช้งานได้หากพิจารณาปัญหาที่ต้องใช้แท็ก @code และองค์ประกอบใดควรกำหนดคลาส prettyprint? Android ใช้ Javadoc ปกติ
noamtm

Xamarin / VS, Android Studio หรือไม่เป็นไร
tyblu

@tyblu Android Studio ใช้งานได้ แต่ Xamarin Studio / VS อาจไม่ทำงานคุณสามารถลองได้
ifeegoo

1

ลองแทนที่ "code" ด้วย "pre" แท็กล่วงหน้าใน HTML ทำเครื่องหมายข้อความว่ามีการจัดรูปแบบไว้ล่วงหน้าและ linefeeds และช่องว่างทั้งหมดจะปรากฏตรงตามที่คุณพิมพ์


1

ฉันเพิ่งอ่าน Javadoc 1.5 การอ้างอิงที่นี่และมีเพียงรหัสที่มี<และต้องอยู่ภายใน> {@code ...}นี่เป็นตัวอย่างง่ายๆ:

 /** 
 * Bla bla bla, for example:
 *
 * <pre>
 * void X() {
 *    List{@code <String>} a = ...;
 *    ...
 * }
 * </pre>
 *
 * @param ...
 * @return ...
 */
 .... your code then goes here ...

0

ฉันใส่โค้ดตัวอย่างของฉันด้วย<pre class="brush: java"></pre>แท็กและใช้SyntaxHighlighterเพื่อเผยแพร่ javadocs ไม่ทำให้ IDE เสียหายและทำให้โค้ดตัวอย่างที่เผยแพร่ออกมาสวยงาม



ด้วยเครื่องมือเน้นข้อความคุณต้องโหลดสคริปต์และ CSS ที่ถูกต้อง ดูน่าอัศจรรย์ แต่คุณต้องใส่เส้นทางที่ถูกต้องไปยังสคริปต์และ css ที่ต้องการ นอกจากนี้หากต้องการใช้ออฟไลน์ต้องระวังเส้นทางที่ถูกต้อง
Alex Byrth

0

การใช้ Java SE 1.6 ดูเหมือนว่าตัวระบุ UPPERCASE PRE ทั้งหมดเป็นวิธีที่ดีที่สุดใน Javadoc:

/**
 * <PRE>
 * insert code as you would anywhere else
 * </PRE>
 */

เป็นวิธีที่ง่ายที่สุดในการทำเช่นนี้

ตัวอย่างจาก javadoc ฉันได้จากวิธี java.awt.Event:

/**
 * <PRE>
 *    int onmask = SHIFT_DOWN_MASK | BUTTON1_DOWN_MASK;
 *    int offmask = CTRL_DOWN_MASK;
 *    if ((event.getModifiersEx() & (onmask | offmask)) == onmask) {
 *        ...
 *    }
 * </PRE>
 */

สิ่งนี้สร้างผลลัพธ์ที่ดูเหมือนรหัสปกติโดยมีการเว้นว่างโค้ดปกติและบรรทัดใหม่ที่ไม่เปลี่ยนแปลง


2
สิ่งนี้จะไม่เพิ่มอะไรให้กับคำตอบที่มีอยู่
madth3

madth3 คุณพูดถูก ฉันคิดว่าฉันเห็นความแตกต่างเมื่อใช้ตัวปรับเปลี่ยนล่วงหน้าต่ำกว่าและ UPPERCASE แต่ในลักษณะที่สองดูเหมือนว่าจะไม่เหมือนมัน มันอาจมีบางอย่างเกี่ยวข้องกับลักษณะที่ปรากฏบนหน้าเว็บนี้กับลักษณะที่ปรากฏใน javadoc
Eugene_CD-adapco

1
พิจารณาตัวอักษรเล็กและใหญ่ในแท็ก html หรือไม่
Jasonw

0

ใน Visual Studio Code อย่างน้อยคุณสามารถบังคับให้คอมเม้นท์ Javadoc เคารพการขึ้นบรรทัดใหม่โดยการตัดมันในทริบแบ็คสามครั้งดังที่แสดงด้านล่าง:

/** ```markdown
 * This content is rendered in (partial) markdown.
 * 
 * For example, *italic* and **bold** text works, but [links](https://www.google.com) do not.
 * Bonus: it keeps single line-breaks, as seen between this line and the previous.
 ``` */
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.