Ví dụ mã nhiều dòng trong nhận xét Javadoc


531

Tôi có một ví dụ mã nhỏ mà tôi muốn đưa vào nhận xét Javadoc cho một phương thức.

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

Vấn đề là ví dụ mã hiển thị trong Javadoc không có ngắt dòng khiến nó khó đọc.

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

Tôi đoán rằng tôi đã sai khi cho rằng thẻ mã sẽ xử lý ngắt dòng. Cách tốt nhất để định dạng các ví dụ mã trong các bình luận Javadoc là gì?

Câu trả lời:


743

Ngoài các <pre>thẻ đã được đề cập , bạn cũng nên sử dụng @codechú thích JavaDoc, điều này sẽ giúp cuộc sống dễ dàng hơn nhiều khi gặp các vấn đề về thực thể HTML (đặc biệt là với Generics), ví dụ:

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

Sẽ cung cấp đầu ra HTML chính xác:

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

Trong khi bỏ qua @codekhối (hoặc sử dụng <code>thẻ) sẽ dẫn đến HTML như thế này:

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

(Để tham khảo, có thể tìm thấy các mô tả thẻ Java SE 8 tại đây: Thẻ Javadoc )


63
Tôi cũng có thể nghĩ như vậy, nhưng thật không may, bạn vẫn cần thêm thẻ <pre> để ngắt dòng.
Fabian Steeg

12
Thật không may, dường như khi bạn nhấn ctrl + shift + F (Mã định dạng trong Eclipse), Eclipse sẽ làm rối thẻ {@code} và thay thế nó bằng {& # 064; mã ...
jpdaigle

3
@jpdaigle Tôi vừa thử điều này trong Eclipse Galileo và Helios và trình định dạng không thay thế bất cứ điều gì cho tôi (trên Mac OS, nhưng tôi chưa bao giờ thấy trình định dạng làm bất cứ điều gì như vậy trên các nền tảng khác).
Fabian Steeg

30
Một điều không may khác, nếu bạn có các khối trong mã ví dụ của mình bằng cách sử dụng dấu ngoặc nhọn "{}", dấu ngoặc đóng đầu tiên sẽ chấm dứt khối @code. Một cách khác là sử dụng (chờ cho nó ...) các thực thể html cho dấu ngoặc nhọn. Tôi không thấy một đối số hấp dẫn cho các thẻ <pre> cho mã có các khối.
Ed Griebel

2
Eclipse làm rối thẻ {@code} và thay thế nó bằng {& # 064; code- Đây không phải là do Eclipse, đây là vì tiện ích javadoc (đã bị lỗi?). Nếu bạn có ký tự @ trong mã đa dòng bên trong {@code ... multiline ...} thì javadoc không thể phân tích chính xác :( Ít nhất đây là những gì tôi thấy với triển khai javadoc của Oracle JDK1.7.0_45.
Nam

167

Tôi đã có một thời gian thực sự khó khăn với việc đưa một ví dụ mã cụ thể vào một bình luận javadoc. Tôi muốn chia sẻ cái này
Xin lưu ý những điều sau:

  • sử dụng <code>thẻ cũ để ngăn các dấu ngoặc nhọn không bị hiểu
  • sử dụng {@code ...}thẻ "mới" - để có được tổng quát bao gồm trong đầu ra
  • thoát khỏi đăng nhập @ @Overridethông qua " {@literal @}Override" vì trình tạo javadoc "nghiêng" ở đó do thực tế là @ đi trực tiếp sau một dấu ngoặc nhọn mở
  • xóa một khoảng trống ở phía trước {@code{@literal, để bù các khoảng trống bên trong và giữ căn chỉnh

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

được in như

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

2
Điều này hoạt động nhưng tôi nhận được cảnh báo khi chạy javadoc xuất cảnh báo này "cảnh báo: {@code} trong <code>"
Shane Rowatt

3
Đây là câu trả lời có hiệu quả, câu trả lời được chấp nhận không hoạt động tốt trong nhật thực của tôi (4.6.2).
Eric Wang

Tôi tự hỏi tại sao tất cả những điều này là cần thiết, intellij 13 của tôi và sau đó hoạt động tốt với mã trong câu trả lời được chấp nhận. Đây có phải chỉ là một vấn đề nhật thực?
bvdb

Vâng, tôi cũng đã thấy điều này hoạt động tốt trong IntelliJ 11 và sau đó. IntelliJ xử lý nó một cách chính xác. Thật không may, Eclipse KHÔNG hiển thị JavaDoc chính xác (trạng thái di chuột) và bỏ qua cả dòng mới và ngắt html. Tôi đang cố gắng tìm một giải pháp hoạt động tốt trong cả hai IDE, vì chúng là hai trong số những IDE hàng đầu được sử dụng hiện nay.
Michael M

41

Nguồn java có rất nhiều ví dụ hay cho việc này. Đây là một ví dụ từ phần đầu của "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
Tóm lại,<pre><blockquote>...</blockquote></pre>
Jin Kwon

6
Thay vào đó<p><blockquote><pre> </pre></blockquote></p>
masterxilo

@JinKwon thật đáng buồn, điều này không phải lúc nào cũng hoạt động, không phải trong đoạn mã của tôi :( thêm {@code khi bắt đầu hoạt động, ngay cả khi đóng} sẽ không đạt được
benez 17/2/2016

Điều này dường như hoạt động đối với hầu hết các mã, nhưng không thoát khỏi các dấu ngoặc nhọn như trong List<String>. Cho rằng tôi đang sử dụng <pre>{@code ... }</pre>.
Daniel


14

Bạn cần các <pre></pre>thẻ cho ngắt dòng và {@code ... }bên trong chúng cho tổng quát. Nhưng sau đó, không được phép đặt dấu ngoặc mở trên cùng một dòng với <generic>thẻ, vì sau đó mọi thứ sẽ được hiển thị lại trên 1 dòng.

Hiển thị trên một dòng:

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

Hiển thị với ngắt dòng:

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

Một điều kỳ lạ là khi bạn dán nẹp đóng {@code, nó sẽ được hiển thị:

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

Đầu ra:

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

4
Chào mừng bạn đến với Stack Overflow. Để định dạng mã trong bài viết, bạn có thể đặt tiền tố (trên một đoạn riêng biệt) theo bốn khoảng trắng hoặc bao quanh chúng bằng backticks (`` ...``). Bạn không cần <code><pre>thẻ. Tôi chỉnh sửa câu trả lời của bạn trong tâm trí này.
Paŭlo Ebermann

10
/**
 * <blockquote><pre>
 * {@code
 * public Foo(final Class<?> klass) {
 *     super();
 *     this.klass = klass;
 * }
 * }
 * </pre></blockquote>
 **/
  • <pre/> là cần thiết để bảo quản các dòng.
  • {@code phải có dòng riêng
  • <blockquote/> chỉ để thụt.
public Foo(final Class<?> klass) {
    super();
    this.klass = klass;
}


CẬP NHẬT với JDK8

Các yêu cầu tối thiểu cho các mã thích hợp là <pre/>{@code}.

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

sản lượng

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

Và một tùy chọn xung quanh <blockquote/>chèn một vết lõm.

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

sản lượng

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

Chèn <p>hoặc xung quanh với <p></p>mang lại cảnh báo.


5

Tôi đã có thể tạo các tệp HTML ưa nhìn với snip sau - nó được hiển thị trong Mã 1.

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

(Mã 1)

Mã 1 biến thành trang HTML javadoc được tạo trong Hình 1, như mong đợi.

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

(Hình 1)

Tuy nhiên, trong NetBeans 7.2, nếu bạn nhấn Alt + Shift + F (để định dạng lại tệp hiện tại), Mã 1 sẽ chuyển sang Mã 2.

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

(Mã 2)

nơi đầu tiên <pre>bây giờ được chia thành hai dòng. Mã 2 tạo ra tệp HTML javadoc được tạo như trong Hình 2.

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

(Hình 2)

Đề xuất của Steve B (Mã 3) dường như cho kết quả tốt nhất và vẫn được định dạng như mong đợi ngay cả sau khi nhấn Alt + Shift + F.

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

(Mã 3)

Việc sử dụng Mã 3 tạo ra cùng một đầu ra HTML javadoc như trong Hình 1.


4

Đây là hai xu của tôi.

Như các câu trả lời khác đã nêu, bạn nên sử dụng <pre> </pre>kết hợp với {@code }.

Sử dụng pre{@code}

  • Gói mã của bạn bên trong <pre></pre>ngăn mã của bạn sụp đổ vào một dòng;
  • Gói mã của bạn bên trong {@code }ngăn chặn <, >và tất cả mọi thứ ở giữa từ biến mất. Điều này đặc biệt hữu ích khi mã của bạn chứa các biểu thức generic hoặc lambda.

Các vấn đề với chú thích

Các vấn đề có thể phát sinh khi khối mã của bạn chứa một chú thích. Đó có lẽ là vì khi @dấu hiệu xuất hiện ở đầu dòng Javadoc, nó được coi là thẻ Javadoc như @paramhay @return. Ví dụ: mã này có thể được phân tích cú pháp không chính xác:

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

Mã trên sẽ biến mất hoàn toàn trong trường hợp của tôi.

Để khắc phục điều này, dòng không được bắt đầu bằng một @dấu hiệu:

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

Lưu ý rằng có hai khoảng cách giữa @code@Override, để giữ mọi thứ được căn chỉnh với các dòng tiếp theo. Trong trường hợp của tôi (sử dụng Apache Netbeans), nó được hiển thị chính xác.


3

Có một sự khác biệt đáng kể giữa <blockquote><pre>...<pre>{@code....Cái trước sẽ bỏ qua các khai báo kiểu trong tổng quát nhưng cái sau sẽ giữ nó.

E.g.: List<MyClass> myObject = null; hiển thị như List myObject = null;với fairs và như List<MyClass> myObject = null;với thứ hai


2

Nếu bạn là nhà phát triển Android, bạn có thể sử dụng:

<pre class=”prettyprint”>

TODO:your code.

</pre>

Để in đẹp mã của bạn trong Javadoc bằng mã Java.


1
Vui lòng giải thích: những gì trong công cụ của Android sẽ khiến công việc này hoạt động, xem xét các vấn đề yêu cầu thẻ @code? Và thành phần nào nên định nghĩa lớp Prettyprint? Android sử dụng Javadoc thường xuyên.
noamtm

Xamarin / VS, Android Studio, hoặc nó không quan trọng?
tyblu

@tyblu Android Studio hoạt động, nhưng Xamarin Studio / VS có thể không hoạt động. Bạn có thể dùng thử.
ifeegoo

1

Hãy thử thay thế "mã" bằng "trước". Thẻ trước trong HTML đánh dấu văn bản là được định dạng sẵn và tất cả các dòng và khoảng trắng sẽ xuất hiện chính xác khi bạn nhập chúng.


1

Tôi chỉ đọc tài liệu tham khảo Javadoc 1.5 ở đây và chỉ có mã có <>phải được đính kèm bên trong {@code ...}. Đây là một ví dụ đơn giản:

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

0

Tôi kèm theo mã ví dụ của mình với <pre class="brush: java"></pre>các thẻ và sử dụng SyntaxHighlighter cho javadocs được xuất bản. Nó không làm tổn thương IDE và làm cho các ví dụ mã được xuất bản trở nên đẹp.



Với Syntax Highlighter, bạn phải tải tập lệnh và sửa lỗi css. Trông thật tuyệt vời, nhưng bạn phải đặt đường dẫn chính xác đến các tập lệnh và css cần thiết. Ngoài ra, nếu muốn sử dụng ngoại tuyến, phải cẩn thận với các đường dẫn chính xác.
Alex Byrth

0

Sử dụng Java SE 1.6, có vẻ như tất cả các định danh UPPERCASE PRE là cách tốt nhất để làm điều này trong Javadoc:

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

là cách đơn giản nhất để làm điều này.

Một ví dụ từ javadoc tôi nhận được từ phương thức java.awt.Event:

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

Điều này tạo ra đầu ra trông giống hệt như mã thông thường, với các khoảng cách mã thông thường và các dòng mới còn nguyên vẹn.


2
Điều này không thêm bất cứ điều gì vào câu trả lời hiện có.
madth3

madth3, bạn nói đúng Tôi nghĩ rằng tôi đã thấy một sự khác biệt khi sử dụng các sửa đổi trước thấp hơn so với UPPERCASE, nhưng ở cái nhìn thứ hai, nó không giống như vậy. Nó cũng có thể có liên quan đến cách nó xuất hiện trên trang web này so với cách nó xuất hiện trong javadoc.
Eugene_CD-adapco

1
trường hợp nhạy cảm trong thẻ html?
Jasonw

0

Ít nhất trong Visual Studio Code, bạn có thể buộc một bình luận Javadoc tôn trọng ngắt dòng bằng cách gói nó trong ba backticks, như được thấy dưới đây:

/** ```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.
 ``` */
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.