Beispiel für mehrzeiligen Code im Javadoc-Kommentar

531

Ich habe ein kleines Codebeispiel, das ich in den Javadoc-Kommentar für eine Methode aufnehmen möchte.

/**
 * -- 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
 */

Das Problem ist, dass das Codebeispiel im Javadoc ohne Zeilenumbrüche angezeigt wird, was das Lesen erschwert.

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

Ich glaube, ich bin falsch in der Annahme, dass das Code-Tag Zeilenumbrüche verarbeiten würde. Wie lassen sich Codebeispiele in Javadoc-Kommentaren am besten formatieren?

Kennzeichen
quelle

Antworten:

743

Zusätzlich zu den bereits erwähnten <pre>Tags sollten Sie auch die @codeJavaDoc-Annotation verwenden, die das Leben bei Problemen mit HTML-Entitäten (insbesondere bei Generics) erheblich erleichtert, z.

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

Gibt die korrekte HTML-Ausgabe:

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

Wenn Sie den @codeBlock weglassen (oder ein <code>Tag verwenden), erhalten Sie HTML wie folgt:

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

(Als Referenz finden Sie Java SE 8-Tag-Beschreibungen hier: Javadoc-Tags )

Fabian Steeg
quelle
63
Das hätte ich auch gedacht, aber leider nicht. Sie müssen immer noch das <pre> -Tag hinzufügen, um Zeilenumbrüche zu erhalten.
Fabian Steeg
12
Leider scheint es, wenn Sie Strg + Umschalt + F (Code in Eclipse formatieren) drücken, Eclipse das {@code} -Tag durcheinander zu bringen und es durch {& # 064; Code zu
ersetzen
3
@jpdaigle Ich habe dies gerade in Eclipse Galileo und Helios versucht und der Formatierer ersetzt nichts für mich (unter Mac OS, aber ich habe noch nie gesehen, dass der Formatierer so etwas auf anderen Plattformen tut).
Fabian Steeg
30
Ein weiteres Unglück: Wenn Sie in Ihrem Beispielcode Blöcke mit geschweiften Klammern "{}" haben, beendet die erste schließende Klammer den @ code-Block. Eine Möglichkeit, dies zu umgehen, besteht darin, HTML-Entitäten für die geschweiften Klammern zu verwenden (darauf warten ...). Ich sehe kein überzeugendes Argument für <pre> -Tags für Code mit Blöcken.
Ed Griebel
2
Eclipse bringt das {@code} -Tag durcheinander und ersetzt es durch {& # 064; code-. Dies liegt nicht an Eclipse, sondern am (fehlerhaften?) Javadoc-Dienstprogramm. Wenn Sie im mehrzeiligen Code in {@code ... multiline ...} ein @ -Zeichen haben, kann javadoc es nicht richtig analysieren :( Zumindest sehe ich dies bei der Javadoc-Implementierung von Oracle JDK1.7.0_45.
Männlich
167

Es fiel mir wirklich schwer, ein bestimmtes Codebeispiel in einen Javadoc-Kommentar aufzunehmen. Ich würde diesen gerne teilen.
Bitte beachten Sie Folgendes:

  • Verwendung von alten <code> Tags, um zu verhindern, dass die geschweiften Klammern interpretiert werden
  • Verwendung von "neu" {@code ...} -Tags, um die in der Ausgabe enthaltenen Generika zu erhalten
  • Escapezeichen der @ Anmeldung @Overridevia "{@literal @}Override ", da der Javadoc-Generator dort "kippt", da das @ direkt nach einer sich öffnenden geschweiften Klammer verläuft
  • Entfernen Sie ein Leerzeichen vor {@codeund {@literal, um Innenräume auszugleichen und die Ausrichtung beizubehalten

Javadoc-Code:

/** 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
  */

wird gedruckt als

new BeanTranslator.Builder()
  .translate(
    new Translator<String, Integer>(String.class, Integer.class){
      @Override
      public Integer translate(String instance) {
        return Integer.valueOf(instance);
      }})
  .build();
Christoph Naber
quelle
2
Dies funktioniert, aber ich erhalte eine Warnung, wenn Javadoc ausgeführt wird und diese Warnung "Warnung: {@code} innerhalb von <code>"
ausgegeben wird
3
Dies ist die, die funktioniert hat, die akzeptierte Antwort funktioniert in meiner Sonnenfinsternis (4.6.2) nicht gut.
Eric Wang
Ich frage mich, warum all dies notwendig ist, mein Intellij 13 und später funktionieren gut mit dem Code in der akzeptierten Antwort. Ist das nur ein Eclipse-Problem?
bvdb
Ja, ich habe diese Funktion auch in IntelliJ 11 und höher gesehen. IntelliJ geht richtig damit um. Leider rendert Eclipse das JavaDoc NICHT korrekt (Schwebezustand) und ignoriert sowohl neue Zeilen als auch HTML-Unterbrechungen. Ich versuche, eine Lösung zu finden, die in beiden IDEs gut funktioniert, da sie zwei der heute am häufigsten verwendeten IDEs sind.
Michael M
41

Die Java-Quelle hat viele gute Beispiele dafür. Hier ist ein Beispiel aus dem Kopf von "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>
...
Steve B.
quelle
9
Zusammenfassend<pre><blockquote>...</blockquote></pre>
Jin Kwon
6
Eher<p><blockquote><pre> </pre></blockquote></p>
masterxilo
@ JinKwon leider funktioniert dies nicht immer, nicht in meinem Code-Snippet :( Das Hinzufügen eines {@ Code am Anfang funktioniert, auch wenn das Schließen} nicht erreicht wird
benez
Dies scheint für den meisten Code zu funktionieren, entgeht jedoch nicht eckigen Klammern wie in List<String>. Dafür benutze ich <pre>{@code ... }</pre>.
Daniel
24

Fügen Sie Ihren mehrzeiligen Code <pre></pre>Tags hinzu.

Zach Scrivena
quelle
14

Sie benötigen die <pre></pre>Tags für die Zeilenumbrüche und die {@code ... }darin enthaltenen für Generika. Aber dann ist es nicht erlaubt, die Öffnungsklammer auf der gleichen Linie wie die zu platzieren<generic> Tag platziert werden, da dann wieder alles in einer Zeile angezeigt wird.

Zeigt in einer Zeile an:

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

Anzeigen mit Zeilenumbrüchen:

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

Eine andere seltsame Sache ist, wenn Sie die schließende Klammer von einfügen {@code, wird es angezeigt:

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

Ausgabe:

public List<Object> getObjects() 
{
   return objects;
}
}
Regel
quelle
4
Willkommen bei Stack Overflow. Um Code in Posts zu formatieren, können Sie ihm entweder (in einem separaten Absatz) vier Leerzeichen voranstellen oder sie mit Backticks (`` ...``) umgeben. Sie brauchen <code>und <pre>Tags nicht. Ich habe Ihre Antwort in diesem Sinne bearbeitet.
Paŭlo Ebermann
10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/> wird zum Erhalt von Linien benötigt.
  • {@code must hat eine eigene Linie
  • <blockquote/> ist nur zum Einrücken.
public Foo(final Class<?> klass) {
    super();
    this.klass = klass;
}


UPDATE mit JDK8

Die Mindestanforderungen für ordnungsgemäße Codes sind <pre/>und {@code}.

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

ergibt

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

Und eine optionale Umgebung <blockquote/>fügt eine Einkerbung ein.

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

ergibt

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

Einfügen <p>oder umgeben mit <p>und </p>gibt Warnungen aus.

Jin Kwon
quelle
5

Ich konnte gut aussehende HTML-Dateien mit dem folgenden in Code 1 gezeigten Snip-It generieren.

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

(Code 1)

Code 1 wurde erwartungsgemäß zur generierten Javadoc-HTML-Seite in Abb. 1.

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

(Abb. 1)

Wenn Sie in NetBeans 7.2 jedoch Alt + Umschalt + F drücken (um die aktuelle Datei neu zu formatieren), wird Code 1 zu Code 2.

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

(Code 2)

wo die erste <pre>ist jetzt auf zwei Zeilen gebrochen. Code 2 erzeugt eine generierte Javadoc-HTML-Datei, wie in Abb. 2 gezeigt.

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

(Abb. 2)

Der Vorschlag von Steve B (Code 3) scheint die besten Ergebnisse zu liefern und bleibt auch nach dem Drücken von Alt + Umschalt + F wie erwartet formatiert.

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

(Code 3)

Die Verwendung von Code 3 erzeugt die gleiche Javadoc-HTML-Ausgabe wie in Abb. 1 gezeigt.

Bitsdanceforme
quelle
4

Hier sind meine zwei Cent.

Wie die anderen Antworten bereits besagen, sollten Sie <pre> </pre>in Verbindung mit verwenden {@code }.

Verwenden Sie preund{@code}

  • Wickeln Sie Ihren Code ein <pre>und </pre>verhindern Sie, dass Ihr Code in einer Zeile zusammenfällt.
  • Das Einwickeln Ihres Codes {@code }verhindert <, dass >alles dazwischen verschwindet. Dies ist besonders nützlich, wenn Ihr Code Generika oder Lambda-Ausdrücke enthält.

Probleme mit Anmerkungen

Probleme können auftreten, wenn Ihr Codeblock eine Anmerkung enthält. Dies liegt wahrscheinlich daran, dass das @Zeichen am Anfang der Javadoc-Zeile als Javadoc-Tag wie @paramoder betrachtet wird @return. Beispielsweise könnte dieser Code falsch analysiert werden:

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

Der obige Code verschwindet in meinem Fall vollständig.

Um dies zu beheben, darf die Zeile nicht mit einem @Zeichen beginnen:

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

Beachten Sie, dass zwischen @codeund zwei Leerzeichen stehen @Override, um die Ausrichtung auf die nächsten Zeilen zu gewährleisten. In meinem Fall (mit Apache Netbeans) wird es korrekt gerendert.

MC Kaiser
quelle
3

Es gibt einen signifikanten Unterschied zwischen <blockquote><pre>...und <pre>{@code....Ersteres lässt die Typdeklarationen in Generika aus, Letzteres behält sie jedoch bei.

E.g.: List<MyClass> myObject = null; zeigt wie List myObject = null;bei den ersten und wie List<MyClass> myObject = null;bei der zweiten

Tamas
quelle
2

Wenn Sie Android-Entwickler sind, können Sie verwenden:

<pre class=”prettyprint”>

TODO:your code.

</pre>

So drucken Sie Ihren Code in Javadoc mit Java-Code.

ifeegoo
quelle
1
Bitte erläutern Sie: Was in den Android-Tools sollte dies bewirken, wenn man die Probleme berücksichtigt, für die das @ code-Tag erforderlich ist? Und welche Komponente sollte die Prettyprint-Klasse definieren? Android verwendet reguläres Javadoc.
Noamtm
Xamarin / VS, Android Studio oder spielt es keine Rolle?
Tyblu
@tyblu Android Studio funktioniert, aber Xamarin Studio / VS funktioniert möglicherweise nicht. Sie können es versuchen.
Ifeegoo
1

Versuchen Sie, "Code" durch "pre" zu ersetzen. Das Pre-Tag in HTML markiert den Text als vorformatiert und alle Zeilenvorschübe und Leerzeichen werden genau so angezeigt, wie Sie sie eingeben.

Edwin
quelle
1

Ich habe gerade die Javadoc 1.5-Referenz hier gelesen und nur den Code mit <und >muss darin enthalten sein {@code ...}. Hier ein einfaches Beispiel:

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

Ich füge meinen Beispielcode <pre class="brush: java"></pre>Tags hinzu und verwende SyntaxHighlighter für veröffentlichte Javadocs. Es schadet der IDE nicht und macht veröffentlichte Codebeispiele schön.

Jarek Przygódzki
quelle
Highlight gefragt unter: stackoverflow.com/questions/1391614/…
Ciro Santilli 法轮功 冠状 病 六四 事件 18
Mit Syntax Highlighter müssen Sie ein Skript laden und CSS korrigieren. Sieht toll aus, aber Sie müssen den richtigen Pfad zu den erforderlichen Skripten und CSS angeben. Wenn Sie offline verwenden möchten, müssen Sie auch mit den richtigen Pfaden vorsichtig sein.
Alex Byrth
0

Unter Verwendung von Java SE 1.6 scheinen alle UPPERCASE PRE-Bezeichner der beste Weg zu sein, dies in Javadoc zu tun:

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

ist der einfachste Weg, dies zu tun.

Ein Beispiel aus einem Javadoc, das ich von einer java.awt.Event-Methode erhalten habe:

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

Dies erzeugt eine Ausgabe, die genau wie der reguläre Code aussieht, wobei die regulären Code-Abstände und neuen Zeilen intakt sind.

Eugene_CD-adapco
quelle
2
Dies fügt den vorhandenen Antworten nichts hinzu.
madth3
madth3, du hast recht. Ich dachte, ich hätte einen Unterschied gesehen, wenn ich niedrigere oder UPPERCASE-Vormodifikatoren verwendet habe, aber auf den zweiten Blick scheint es nicht so zu sein. Es könnte auch etwas damit zu tun haben, wie es auf dieser Webseite angezeigt wird und wie es in Javadoc angezeigt wird.
Eugene_CD-adapco
1
Groß- und Kleinschreibung im HTML-Tag beachten?
Jasonw
0

Zumindest in Visual Studio Code können Sie einen Javadoc-Kommentar zwingen, Zeilenumbrüche zu berücksichtigen, indem Sie ihn in Triple-Backticks einschließen, wie unten dargestellt:

/** ```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.
 ``` */
Venryx
quelle