Esempio di codice a più righe nel commento Javadoc


531

Ho un piccolo esempio di codice che voglio includere nel commento Javadoc per un metodo.

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

Il problema è che l'esempio di codice viene visualizzato in Javadoc senza interruzioni di riga che rendono difficile la lettura.

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

Immagino di sbagliarmi nell'ipotizzare che il tag di codice gestisca le interruzioni di riga. Qual è il modo migliore per formattare esempi di codice nei commenti Javadoc?

Risposte:


743

Oltre ai <pre>tag già menzionati , dovresti anche usare l' @codeannotazione JavaDoc, che renderà la vita molto più semplice quando si tratta di problemi di entità HTML (in particolare con Generics), ad esempio:

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

Fornirà un corretto output HTML:

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

Se si omette il @codeblocco (o si utilizza un <code>tag) si otterrà HTML in questo modo:

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

(Per riferimento, le descrizioni dei tag Java SE 8 sono disponibili qui: Tag Javadoc )


63
Lo avrei pensato anch'io, ma sfortunatamente no, è comunque necessario aggiungere il tag <pre> per ottenere le interruzioni di riga.
Fabian Steeg,

12
Sfortunatamente, sembra che quando premi Ctrl + Maiusc + F (Formatta codice in Eclipse), Eclipse rovina il tag {@code} e lo sostituisce con {& # 064; codice ...
jpdaigle,

3
@jpdaigle Ho appena provato questo in Eclipse Galileo e Helios e il formatter non sostituisce nulla per me (su Mac OS, ma non ho mai visto il formatter fare nulla del genere su altre piattaforme).
Fabian Steeg,

30
Un altro svantaggio, se nel codice di esempio sono presenti blocchi che utilizzano parentesi graffe "{}", la prima parentesi graffa terminerà il blocco @code. Un modo per aggirare il problema consiste nell'utilizzare (attendere ...) entità html per le parentesi graffe. Non vedo un argomento convincente per i tag <pre> per il codice con blocchi.
Ed Griebel,

2
Pasticci Eclipse il tag e lo sostituisce con {& # 064 {}; @code code- Questo non è a causa di Eclipse, questo è causa di utilità javadoc (spiati?). Se hai il carattere @ nel codice multilinea all'interno di {@code ... multiline ...}, javadoc non riesce ad analizzarlo correttamente :( Almeno questo è quello che vedo con l'implementazione javadoc di Oracle JDK1.7.0_45.
Maschio

167

Ho avuto un momento davvero difficile con l'inclusione di un esempio di codice specifico in un commento javadoc. Vorrei condividere questo.
Si prega di notare quanto segue:

  • utilizzo del vecchio <code>tag per impedire l'interpretazione delle parentesi graffe
  • utilizzo del "nuovo" {@code ...}tag per includere i generici nell'output
  • fuga dell'accesso @ @Overridetramite " {@literal @}Override" perché il generatore javadoc "si inclina" lì a causa del fatto che @ va direttamente dopo l'apertura di una parentesi graffa
  • rimuovere uno spazio davanti {@codee {@literal, per compensare gli spazi interni e mantenere l'allineamento

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

viene stampato come

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

2
Funziona ma ricevo un avviso quando eseguo javadoc in uscita questo avviso "warning: {@code} entro <code>"
Shane Rowatt

3
Questo è quello che ha funzionato, la risposta accettata non funziona bene nella mia eclissi (4.6.2).
Eric Wang,

Mi chiedo perché tutto ciò sia necessario, il mio intellij 13 e successivi funzionano bene con il codice nella risposta accettata. È solo un problema di eclissi?
bvdb

Sì, ho visto anche questo lavoro bene in IntelliJ 11 e versioni successive. IntelliJ lo gestisce correttamente. Purtroppo Eclipse NON esegue correttamente il rendering di JavaDoc (stato al passaggio del mouse) e ignora sia le nuove righe che le interruzioni html. Sto cercando di trovare una soluzione che funzioni bene in entrambi gli IDE, poiché sono due dei migliori IDE in uso oggi.
Michael M,

41

La fonte java ha molti buoni esempi per questo. Ecco un esempio dal capo di "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
In sintesi,<pre><blockquote>...</blockquote></pre>
Jin Kwon,

6
Piuttosto<p><blockquote><pre> </pre></blockquote></p>
masterxilo il

@JinKwon purtroppo non sempre funziona, non nel mio frammento di codice :( l'aggiunta di un {@code all'inizio funziona, anche se la chiusura} non verrà raggiunta
benez,

Questo sembra funzionare per la maggior parte del codice, ma non sfugge alle parentesi angolari come in List<String>. Per quello che sto usando <pre>{@code ... }</pre>.
Daniel,


14

Sono necessari i <pre></pre>tag per le interruzioni di riga e l' {@code ... }interno per i generici. Ma poi non è consentito posizionare la parentesi graffa di apertura sulla stessa riga del <generic>tag, perché tutto verrà nuovamente visualizzato su 1 riga.

Visualizza su una riga:

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

Visualizza con interruzioni di riga:

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

Un'altra cosa strana è quando si incolla il controvento di chiusura {@code, viene visualizzato:

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

Produzione:

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

4
Benvenuto in Stack Overflow. Per formattare il codice nei post, puoi prefissarlo (su un paragrafo separato) di quattro spazi o circondarli con i backtick (`` ...``). Non hai bisogno <code>e <pre>tag. Ho modificato la tua risposta in questa mente.
Paŭlo Ebermann,

10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/> è necessario per preservare le linee.
  • {@code deve avere una sua linea
  • <blockquote/> è solo per rientro.
public Foo(final Class<?> klass) {
    super();
    this.klass = klass;
}


AGGIORNAMENTO con JDK8

I requisiti minimi per i codici corretti sono <pre/>e {@code}.

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

i rendimenti

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

E un circostante opzionale <blockquote/>inserisce una rientranza.

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

i rendimenti

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

Inserimento <p>o circostante con <p>e </p>genera avvisi.


5

Sono stato in grado di generare file HTML di bell'aspetto con il seguente snip-it mostrato nel codice 1.

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

(Codice 1)

Il codice 1 è stato convertito nella pagina HTML javadoc generata nella Figura 1, come previsto.

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

(Fig. 1)

Tuttavia, in NetBeans 7.2, se si preme Alt + Maiusc + F (per riformattare il file corrente), il Codice 1 si trasforma in Codice 2.

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

(Codice 2)

dove il primo <pre>è ora spezzato su due linee. Il codice 2 produce file HTML javadoc generato, come mostrato nella figura 2.

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

(Fig 2)

Il suggerimento di Steve B (codice 3) sembra dare i migliori risultati e rimane formattato come previsto anche dopo aver premuto Alt + Maiusc + F.

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

(Codice 3)

L'uso del codice 3 produce lo stesso output HTML javadoc come mostrato in Fig 1.


4

Ecco i miei due centesimi.

Come già indicato dalle altre risposte, dovresti usare <pre> </pre>in congiunzione con {@code }.

Usa pree{@code}

  • Avvolgere il codice all'interno <pre>e </pre>impedisce al codice di collassare su una riga;
  • Avvolgendo il codice all'interno {@code }previene <, >e tutto il resto dalla scomparsa. Ciò è particolarmente utile quando il codice contiene espressioni generiche o lambda.

Problemi con le annotazioni

Possono sorgere problemi quando il blocco di codice contiene un'annotazione. Questo probabilmente perché quando il @segno appare all'inizio della riga Javadoc, viene considerato un tag Javadoc come @paramo @return. Ad esempio, questo codice potrebbe essere analizzato in modo errato:

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

Il codice sopra scomparirà completamente nel mio caso.

Per risolvere questo problema, la riga non deve iniziare con un @segno:

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

Nota che ci sono due spazi tra @codee @Override, per mantenere le cose allineate con le linee successive. Nel mio caso (usando Apache Netbeans) è reso correttamente.


3

Esiste una differenza significativa tra <blockquote><pre>...e <pre>{@code....Il primo ometterà le dichiarazioni di tipo in generici ma il secondo lo manterrà.

E.g.: List<MyClass> myObject = null; viene visualizzato come List myObject = null;con i primi e come List<MyClass> myObject = null;con il secondo


2

Se sei uno sviluppatore Android puoi utilizzare:

<pre class=”prettyprint”>

TODO:your code.

</pre>

Per stampare graziosamente il tuo codice in Javadoc con il codice Java.


1
Spiega: cosa dovrebbe funzionare negli strumenti di Android, considerando i problemi che richiedono il tag @code? E quale componente dovrebbe definire la classe prettyprint? Android utilizza Javadoc normale.
Noamtm,

Xamarin / VS, Android Studio o non importa?
Tyblu,

@tyblu Android Studio funziona, ma Xamarin Studio / VS potrebbe non funzionare. Puoi provare.
ifeegoo,

1

Prova a sostituire "code" con "pre". Il pre tag in HTML contrassegna il testo come preformattato e tutti gli avanzamenti di riga e gli spazi verranno visualizzati esattamente durante la digitazione.


1

Ho appena letto il riferimento Javadoc 1.5 qui e solo il codice con <e >deve essere racchiuso all'interno {@code ...}. Ecco un semplice esempio:

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

0

Allego il mio codice di esempio con i <pre class="brush: java"></pre>tag e utilizzo SyntaxHighlighter per i javadocs pubblicati. Non danneggia IDE e rende belli gli esempi di codice pubblicati.



Con Syntax Highlighter devi caricare script e correggere i CSS. Sembra incredibile, ma devi mettere il percorso corretto per gli script e i CSS richiesti. Inoltre, se desideri utilizzare offline, devi fare attenzione con i percorsi corretti.
Alex Byrth,

0

Utilizzando Java SE 1.6, sembra che tutti gli identificatori PRE MAIUSCOLI siano il modo migliore per farlo in Javadoc:

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

è il modo più semplice per farlo.

Un esempio da un javadoc che ho ottenuto da un metodo java.awt.Event:

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

Questo produce un output che assomiglia esattamente al codice normale, con le spaziature del codice regolari e le nuove linee intatte.


2
Questo non aggiunge nulla alle risposte esistenti.
madth3,

madth3, hai ragione. Pensavo di aver visto una differenza usando i pre-modificatori inferiore vs. MAIUSCOLO, ma al secondo sguardo, non mi sembra. Potrebbe anche avere qualcosa a che fare con il modo in cui è apparso in questa pagina Web rispetto a come appare in javadoc.
Eugene_CD-adaptco

1
case sensitive nel tag html?
Jasonw il

0

Almeno in Visual Studio Code, puoi forzare un commento Javadoc a rispettare le interruzioni di riga avvolgendolo in triple backtick, come mostrato di seguito:

/** ```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.
 ``` */
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.