Приклад декількох рядків коду в коментарі 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 Tags )


63
Я б теж подумав, але, на жаль, це не так, вам все одно потрібно додати тег <pre>, щоб отримати розриви рядків.
Фабіан Стіг

12
На жаль, здається, що після натискання клавіші ctrl + shift + F (код форматування у Eclipse) Eclipse змінює тег {@code} та замінює його кодом {& # 064; ...
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).
Ерік Ван

Цікаво, чому все це потрібно, мій інтелінг 13 і пізніше добре працює з кодом у прийнятій відповіді. Це лише питання затемнення?
bvdb

Так, я також добре бачив цю роботу в 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>теги. Я відредагував вашу відповідь в цьому розумі.
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-файли за допомогою наступного фрагменту, показаного в Код 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 створює генерований HTML-файл javadoc, як показано на фіг.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 створює той самий вихідний HTML Java, як показано на фіг.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? І який компонент повинен визначати клас доситьprint? 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. Крім того, якщо ви хочете використовувати офлайн, слід бути обережними з правильними шляхами.
Alex Byrth

0

Використовуючи Java SE 1.6, схоже, що всі ідентифікатори 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-adaco

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.
 ``` */
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.