Exemplo de código de linha múltipla no comentário Javadoc


531

Eu tenho um pequeno exemplo de código que quero incluir no comentário do Javadoc para um método.

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

O problema é que o exemplo de código aparece no Javadoc sem quebras de linha, dificultando a leitura.

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

Acho que estou errado ao supor que a tag de código lidaria com quebras de linha. Qual é a melhor maneira de formatar exemplos de código nos comentários do Javadoc?

Respostas:


743

Além das <pre>tags já mencionadas , você também deve usar a @codeanotação JavaDoc, que tornará a vida muito mais fácil quando se trata de problemas de entidades HTML (principalmente os genéricos), por exemplo:

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

Fornecerá a saída HTML correta:

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

A omissão do @codebloco (ou o uso de uma <code>tag) resultará em HTML assim:

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

(Para referência, as descrições de tags do Java SE 8 podem ser encontradas aqui: Tags Javadoc )


63
Eu pensaria assim também, mas infelizmente não, você ainda precisará adicionar a tag <pre> para obter quebras de linha.
Fabian Steeg

12
Infelizmente, parece que quando você bater CTRL + SHIFT + F (código Format em Eclipse), messes Eclipse até a {@code} tag e substitui-lo com {& # 064; código ...
jpdaigle

3
@jpdaigle Acabei de tentar isso no Eclipse Galileo e Helios e o formatador não substitui nada para mim (no Mac OS, mas nunca vi o formatador fazer algo assim em outras plataformas).
Fabian Steeg

30
Outro infeliz, se você tiver blocos no seu código de exemplo usando chaves "{}", a primeira chave de fechamento encerrará o bloco @code. Uma maneira de contornar isso é usar (espere ...) entidades html para os chavetas. Não vejo um argumento convincente para tags <pre> para código com blocos.
Ed Griebel

2
O Eclipse atrapalha a tag {@code} e a substitui pelo código {- Não é por causa do Eclipse, é por causa do utilitário javadoc (com bug?). Se você tiver @ caractere no código de múltiplas linhas dentro de {@code ... multiline ...}, o javadoc falhará ao analisá-lo corretamente :( Pelo menos é o que eu vejo na implementação do javadoc do Oracle JDK1.7.0_45.
Masculino

167

Eu tive um tempo muito difícil ao incluir um exemplo de código específico em um comentário do javadoc. Eu gostaria de compartilhar este.
Por favor observe o seguinte:

  • uso de idade <code> tags para impedir que os colchetes sejam interpretados
  • uso de "novo" {@code ...} tag para incluir os genéricos na saída
  • escape do login @ @Overridevia "{@literal @}Override " porque o gerador javadoc "inclina" lá devido ao fato de o @ ir diretamente após um colchete de abertura
  • remova um espaço na frente {@codee {@literal, para compensar os espaços internos e manter o alinhamento

código 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
  */

é impresso como

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

2
Isso funciona, mas eu recebo um aviso ao executar o javadoc produzir este aviso "AVISO: {@code} dentro de <code>"
Shane Rowatt

3
Foi o que funcionou, a resposta aceita não funciona bem no meu eclipse (4.6.2).
Eric Wang

Eu me pergunto por que tudo isso é necessário, meu intelecto 13 e mais tarde funcionam bem com o código na resposta aceita. Isso é apenas um problema de eclipse?
bvdb

Sim, também vi esse trabalho bem no IntelliJ 11 e posterior. O IntelliJ lida com isso corretamente. Infelizmente, o Eclipse NÃO renderiza o JavaDoc corretamente (estado de foco) e ignora novas linhas e quebras de html. Estou tentando encontrar uma solução que funcione bem nos dois IDE, já que eles são dois dos principais IDE em uso atualmente.
Michael M

41

A fonte java tem muitos bons exemplos para isso. Aqui está um exemplo do cabeçalho de "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
Resumindo:<pre><blockquote>...</blockquote></pre>
Jin Kwon

6
Em vez disso<p><blockquote><pre> </pre></blockquote></p>
masterxilo

@JinKwon infelizmente isso não está sempre trabalhando, não no meu trecho de código :( adicionando um {@code nas obras iniciais, mesmo que o fechamento} não será alcançado
Benez

Parece funcionar para a maioria dos códigos, mas não escapa colchetes angulares, como em List<String>. Para isso eu estou usando <pre>{@code ... }</pre>.
Daniel


14

Você precisa das <pre></pre>tags para as quebras de linha e de {@code ... }dentro delas para genéricos. Mas não é permitido colocar a chave de abertura na mesma linha que a<generic> tag, pois tudo será exibido em uma linha novamente.

Exibe em uma linha:

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

Exibe com quebras de linha:

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

Outra coisa estranha é que quando você cola a chave de fechamento {@code, ela é exibida:

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

Resultado:

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

4
Bem-vindo ao Stack Overflow. Para formatar o código nas postagens, você pode prefixá-lo (em um parágrafo separado) por quatro espaços ou cercá-lo por reticulares (`` ...``). Você não precisa <code>e <pre>tags. Eu editei sua resposta nessa mente.
Paŭlo Ebermann

10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/> é necessário para preservar as linhas.
  • {@code deve ter sua própria linha
  • <blockquote/> é apenas para indentação.
public Foo(final Class<?> klass) {
    super();
    this.klass = klass;
}


ATUALIZAÇÃO com JDK8

Os requisitos mínimos para códigos adequados são <pre/>e {@code}.

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

rendimentos

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

E um ambiente opcional <blockquote/>insere um recuo.

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

rendimentos

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

Inserir <p>ou circundar <p>e </p>emitir avisos.


5

Consegui gerar arquivos HTML de boa aparência com o seguinte snip-it mostrado no Código 1.

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

(Código 1)

O código 1 se transformou na página HTML javadoc gerada na Figura 1, conforme o esperado.

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

(Figura 1)

No entanto, no NetBeans 7.2, se você pressionar Alt + Shift + F (para reformatar o arquivo atual), o Código 1 será convertido no Código 2.

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

(Código 2)

onde o primeiro <pre>agora está dividido em duas linhas. O código 2 produz o arquivo HTML javadoc gerado, como mostra a Figura 2.

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

(Figura 2)

A sugestão de Steve B (Código 3) parece dar os melhores resultados e permanece formatada conforme o esperado, mesmo depois de pressionar Alt + Shift + F.

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

(Código 3)

O uso do Código 3 produz a mesma saída HTML javadoc, como mostrado na Fig 1.


4

Aqui estão meus dois centavos.

Como as outras respostas já afirmam, você deve usar <pre> </pre>em conjunto com {@code }.

Use pree{@code}

  • Quebrar o código por dentro <pre>e </pre>impedir que ele caia em uma linha;
  • Envolvendo o seu código dentro {@code }impede <, >e tudo no meio de desaparecer. Isso é particularmente útil quando seu código contém expressões genéricas ou lambda.

Problemas com anotações

Podem surgir problemas quando o seu bloco de código contém uma anotação. Provavelmente porque, quando o @sinal aparece no início da linha Javadoc, é considerado uma tag Javadoc como @paramou @return. Por exemplo, esse código pode ser analisado incorretamente:

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

O código acima desaparecerá completamente no meu caso.

Para corrigir isso, a linha não deve começar com um @sinal:

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

Observe que existem dois espaços entre @codee @Override, para manter as coisas alinhadas com as próximas linhas. No meu caso (usando o Apache Netbeans), ele é renderizado corretamente.


3

Há uma diferença significativa entre <blockquote><pre>...e <pre>{@code....O primeiro omitirá as declarações de tipo nos genéricos, mas o último o manterá.

E.g.: List<MyClass> myObject = null; exibe como List myObject = null;com os primeiros e como List<MyClass> myObject = null;com o segundo


2

Se você é um desenvolvedor Android, pode usar:

<pre class=”prettyprint”>

TODO:your code.

</pre>

Para imprimir bem seu código em Javadoc com código Java.


1
Por favor, explique: o que as ferramentas do Android devem fazer com que isso funcione, considerando os problemas que exigem a tag @code? E qual componente deve definir a classe prettyprint? Android usa Javadoc regular.
noamtm

Xamarin / VS, Android Studio ou isso não importa?
tyblu

O @tyblu Android Studio funciona, mas o Xamarin Studio / VS talvez não funcione. Você pode tentar.
ifeegoo

1

Tente substituir "código" por "pré". A tag pré em HTML marca o texto como pré-formatado e todos os feeds de linha e espaços aparecerão exatamente à medida que você os digita.


1

Acabei de ler a referência do Javadoc 1.5 aqui , e apenas o código com <e >deve ser colocado dentro {@code ...}. Aqui está um exemplo simples:

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

0

Eu incluo meu código de exemplo com <pre class="brush: java"></pre>tags e uso o SyntaxHighlighter para javadocs publicados. Não prejudica o IDE e torna bonitos exemplos de código publicados.



Com o Sintaxe Highlighter, você deve carregar o script e corrigir o css. Parece incrível, mas você deve colocar o caminho correto para os scripts e css necessários. Além disso, se você deseja usar offline, deve ter cuidado com os caminhos corretos.
Alex Byrth

0

Usando o Java SE 1.6, parece que todos os identificadores UPPERCASE PRE são a melhor maneira de fazer isso no Javadoc:

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

é a maneira mais simples de fazer isso.

Um exemplo de um javadoc que recebi de um método java.awt.Event:

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

Isso produz uma saída que se parece exatamente com o código regular, com os espaçamentos regulares do código e as novas linhas intactas.


2
Isso não adiciona nada às respostas existentes.
madth3

madth3, você está certo. Eu pensei ter visto uma diferença ao usar pré-modificadores inferiores vs. UPPERCASE, mas, em segundo lugar, não parece. Também pode ter algo a ver com o modo como apareceu nesta página da Web versus como aparece no javadoc.
Eugene_CD-adapco

1
diferencia maiúsculas de minúsculas na tag html?
Jasonw #

0

Pelo menos no Visual Studio Code, você pode forçar um comentário do Javadoc a respeitar quebras de linha envolvendo-o em reticulares triplos, conforme mostrado abaixo:

/** ```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.
 ``` */
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.