Пример многострочного кода в комментарии Javadoc


532

У меня есть небольшой пример кода, который я хочу включить в комментарий 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?

Ответы:


744

В дополнение к уже упомянутым <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>, чтобы получить разрывы строк.
Фабиан Стиг

12
К сожалению, кажется, что когда вы нажмете Ctrl + Shift + F (Форматировать код в Eclipse), Eclipse испортит тег {@code} и заменит его на {& # 064; code ...
jpdaigle

3
@jpdaigle Я только что попробовал это в Eclipse Galileo и Helios, и форматировщик мне ничего не заменяет (в Mac OS, но я никогда не видел, чтобы форматировщик делал что-то подобное на других платформах).
Фабиан Стиг

30
Еще один недостаток, если в вашем примере кода есть блоки, использующие фигурные скобки «{}», первая закрывающая фигурная скобка завершит блок @code. Один из способов обойти это - использовать (ждать это ...) HTML-сущности для фигурных скобок. Я не вижу убедительного аргумента для тегов <pre> для кода с блоками.
Эд Грибель

2
Eclipse испортил тег {@code} и заменил его на {& # 064; code. Это не из-за Eclipse, а из-за (прослушанной?) Утилиты javadoc. Если в многострочном коде внутри {@code ... multiline ...} есть символ @, то javadoc не сможет правильно его проанализировать :( По крайней мере, это то, что я вижу в реализации Javadoc Oracle JDK1.7.0_45.
Мужчина

167

У меня было действительно тяжелое время с включением конкретного примера кода в комментарий Javadoc. Я хотел бы поделиться этим.
Пожалуйста, обратите внимание на следующее:

  • использование старого <code>тега для предотвращения интерпретации фигурных скобок
  • использование {@code ...}тега «new» для получения обобщенных элементов, включенных в вывод
  • экранирование знака @ @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>»
Шейн Роватт

3
Это сработало, принятый ответ плохо работает в моем затмении (4.6.2).
Эрик Ван

Интересно, зачем все это нужно, мой intellij 13 и более поздние прекрасно работают с кодом в принятом ответе. Это просто проблема затмения?
августа

Да, я также видел эту работу отлично в IntelliJ 11 и позже. IntelliJ справляется с этим правильно. К сожалению, Eclipse НЕ корректно отображает JavaDoc (состояние при наведении курсора) и игнорирует как новые строки, так и разрывы html. Я пытаюсь найти решение, которое хорошо работает в обеих IDE, поскольку они являются одними из лучших IDE, используемых сегодня.
Майкл М

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>
Джин Квон

6
Скорее<p><blockquote><pre> </pre></blockquote></p>
masterxilo

@JinKwon к сожалению, это не всегда работает, не в моем фрагменте кода :( добавление {@code в начале работает, даже если закрытие} не будет достигнуто
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
Добро пожаловать на переполнение стека. Чтобы отформатировать код в сообщениях, вы можете либо поставить перед ним префикс (в отдельном абзаце) четырьмя пробелами, либо окружить их обратными чертами (`` ...``). Вам не нужны <code>и <pre>теги. Я отредактировал ваш ответ в этом уме.
Пауло Эберманн

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-файл с помощью следующего фрагмента кода, показанного в коде 1.

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

(Код 1)

Код 1 превратился в сгенерированную HTML-страницу javadoc на рис. 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)

Предложение Стива Б (Код 3), кажется, дает лучшие результаты и остается отформатированным, как и ожидалось, даже после нажатия Alt + Shift + F.

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

(Код 3)

Использование кода 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....первый будет опускать объявления типов в обобщениях, но последний сохранит их.

E.g.: List<MyClass> myObject = null; отображается как List myObject = null;с первого и как 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

Попробуйте заменить «код» на «предварительно». Предварительный тег в HTML помечает текст как предварительно отформатированный, и все переводы строк и пробелы будут отображаться точно по мере их ввода.


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 и делает опубликованные примеры кода красивыми.



С Syntax Highlighter вы должны загрузить скрипт и исправить CSS. Выглядит потрясающе, но вы должны указать правильный путь к необходимым скриптам и CSS. Кроме того, если вы хотите использовать в автономном режиме, должны быть осторожны с правильными путями.
Алекс Бирт

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, ты прав. Я думал, что видел разницу при использовании пре-модификаторов low и UPPERCASE, но на второй взгляд это не так. Это также может быть связано с тем, как оно появилось на этой веб-странице, и с тем, как оно выглядит в javadoc.
Eugene_CD-adapco

1
с учетом регистра в теге HTML?
Джейсон

0

По крайней мере, в коде Visual Studio вы можете заставить комментарий 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.
 ``` */
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.