【问题标题】:Multiple line code example in Javadoc commentJavadoc 注释中的多行代码示例
【发布时间】:2010-10-07 05:10:00
【问题描述】:

我有一个小代码示例,我想将其包含在方法的 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 cmets 中格式化代码示例的最佳方式是什么?

【问题讨论】:

    标签: java html javadoc


    【解决方案1】:

    除了已经提到的&lt;pre&gt; 标记之外,您还应该使用@code JavaDoc 注释,这将使处理 HTML 实体问题(尤其是泛型)变得更加轻松,例如:

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

    会给出正确的 HTML 输出:

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

    虽然省略 @code 块(或使用 &lt;code&gt; 标记)将导致 HTML 如下所示:

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

    作为参考,可以在here 找到 Java SE 8 中可用的标记描述的完整列表。

    【讨论】:

    • 我也是这么想的,可惜没有,你还是需要加上
      标签才能换行。
    • 不幸的是,当您点击 ctrl+shift+F(在 Eclipse 中格式化代码)时,Eclipse 会弄乱 {@code} 标签并将其替换为 {@code ...
    • @jpdaigle 我刚刚在 Eclipse Galileo 和 Helios 中尝试过,格式化程序并没有取代我的任何东西(在 Mac OS 上,但我也从未见过格式化程序在其他平台上做类似的事情)。
    • 另一个不幸的是,如果您的示例代码中有使用大括号“{}”的块,则第一个右大括号将终止 @code 块。解决它的一种方法是使用(等待它......) html 实体作为大括号。对于带有块的代码的
       标记,我没有看到令人信服的论据。
    • Eclipse 弄乱了 {@code} 标签并将其替换为 {@code- 这不是因为 Eclipse,而是因为(错误? ) javadoc 实用程序。如果您在 {@code ...multiline...} 内的多行代码中有 @ 字符,则 javadoc 无法正确解析它:(至少这是我在 Oracle JDK1.7.0_45 javadoc 实现中看到的。
    【解决方案2】:

    我很难在 javadoc 注释中包含特定代码示例。我想分享这个。
    请注意以下几点:

    • 使用旧的&lt;code&gt; - 防止大括号被解释的标记
    • 使用“new”{@code ...} - 标记以获取包含在输出中的泛型
    • 通过“{@literal @}Override”在@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();
    

    【讨论】:

    • 这行得通,但是在运行 javadoc 输出此警告“警告: 内的 {@code}” 时我收到警告
    • 这是一个有效的方法,接受的答案在我的日食(4.6.2)中效果不佳。
    • 我想知道为什么所有这些都是必要的,我的 intellij 13 及更高版本可以正常使用已接受答案中的代码。这只是一个日食问题吗?
    • 是的,我在 IntelliJ 11 及更高版本中也看到了这项工作。 IntelliJ 正确处理它。不幸的是,Eclipse 没有正确呈现 JavaDoc(悬停状态),并且忽略了新行和 html 中断。我正在尝试找到一个在这两个 IDE 中都运行良好的解决方案,因为它们是当今使用的两个顶级 IDE。
    【解决方案3】:

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

    【讨论】:

    • 总之,&lt;pre&gt;&lt;blockquote&gt;...&lt;/blockquote&gt;&lt;/pre&gt;
    • 而是&lt;p&gt;&lt;blockquote&gt;&lt;pre&gt; &lt;/pre&gt;&lt;/blockquote&gt;&lt;/p&gt;
    • @JinKwon 遗憾的是,这并不总是有效,不在我的代码 sn-p 中 :( 在开头添加 {@code 有效,即使无法达到关闭 }
    • 这似乎适用于大多数代码,但不能转义尖括号,例如List&lt;String&gt;。为此,我使用&lt;pre&gt;{@code ... }&lt;/pre&gt;
    • 如果文档本身包含}@Daniel 将不起作用。这个右花括号将结束 {@code ...}
    【解决方案4】:

    &lt;pre&gt;&lt;/pre&gt; 标签括起来你的多行代码。

    【讨论】:

      【解决方案5】:

      您需要&lt;pre&gt;&lt;/pre&gt; 标记用于换行符,而其中{@code ... } 用于泛型。但是不允许将左大括号与&lt;generic&gt; 标签放在同一行,因为那样所有内容都会再次显示在一行上。

      显示在一行上:

      * ..
      * <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;
      }
      }
      

      【讨论】:

      • 欢迎使用 Stack Overflow。要格式化帖子中的代码,您可以在其前面(在单独的段落中)添加四个空格,或者在它们周围加上反引号(``...``)。你不需要&lt;code&gt;&lt;pre&gt; 标签。我在这个想法中编辑了你的答案。
      • 显示额外右大括号的原因是您的第一个右大括号实际上被解释为{@code, 的结尾,因此第二个右大括号成为显示的简单文本。简而言之,问题是您在示例代码中使用@code 但没有大括号,或者您不使用并且被允许在纯
         块中使用大括号...
      【解决方案6】:
      /**
       * <blockquote><pre>
       * {@code
       * public Foo(final Class<?> klass) {
       *     super();
       *     this.klass = klass;
       * }
       * }
       * </pre></blockquote>
       **/
      
      • 保留行需要&lt;pre/&gt;
      • {@code 必须有自己的线路
      • &lt;blockquote/&gt; 仅用于缩进。
      public Foo(final Class<?> klass) {
          super();
          this.klass = klass;
      }
      


      使用 JDK8 更新

      正确代码的最低要求是&lt;pre/&gt;{@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");
       }
      

      并且可选的环绕&lt;blockquote/&gt; 插入一个缩进。

      /**
       * 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");
           }
      

      插入&lt;p&gt; 或用&lt;p&gt;&lt;/p&gt; 包围会产生警告。

      【讨论】:

        【解决方案7】:

        这是我的两分钱。

        正如其他答案已经说明的那样,您应该将 &lt;pre&gt; &lt;/pre&gt;{@code } 结合使用。

        使用pre{@code}

        • 将您的代码封装在 &lt;pre&gt;&lt;/pre&gt; 中可防止您的代码折叠成一行;
        • 将您的代码封装在 {@code } 中可以防止 &lt;&gt; 以及介于两者之间的所有内容消失。这在您的代码包含泛型或 lambda 表达式时特别有用。

        注释问题

        当您的代码块包含注释时,可能会出现问题。这可能是因为当@ 符号出现在Javadoc 行的开头时,它被认为是像@param@return 这样的Javadoc 标记。例如,这段代码可能被错误地解析:

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

        在我的情况下,上面的代码将完全消失。

        要解决此问题,该行不得以 @ 符号开头:

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

        请注意,@code@Override 之间有两个空格,以使内容与下一行对齐。在我的情况下(使用 Apache Netbeans)它被正确呈现。

        【讨论】:

          【解决方案8】:

          我能够使用代码 1 中所示的以下片段生成好看的 HTML 文件。

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

          (代码 1)

          代码 1 变成了图 1 中生成的 javadoc HTML 页面,正如预期的那样。

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

          (图一)

          但是,在 NetBeans 7.2 中,如果您按 Alt+Shift+F(重新格式化当前文件),代码 1 会变为代码 2。

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

          (代码 2)

          第一个&lt;pre&gt; 现在被分成两行。代码 2 生成生成的 javadoc HTML 文件,如图 2 所示。

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

          (图2)

          Steve B 的建议(代码 3)似乎给出了最好的结果,并且即使在按下 Alt+Shift+F 后仍保持预期的格式。

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

          (代码 3)

          使用 Code 3 会产生与图 1 所示相同的 javadoc HTML 输出。

          【讨论】:

            【解决方案9】:

            &lt;blockquote&gt;&lt;pre&gt;...&lt;pre&gt;{@code.... 有很大区别,前者会省略泛型中的类型声明,后者会保留。

            E.g.: List<MyClass> myObject = null; 第一个显示为List myObject = null;,第二个显示为List&lt;MyClass&gt; myObject = null;

            【讨论】:

              【解决方案10】:

              我刚刚阅读了Javadoc 1.5 参考here,只有&lt;&gt; 的代码必须包含在{@code ...} 中。这里举个简单的例子:

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

              【讨论】:

              • 很惊讶这还不够投票!这解决了我的问题,因为同时使用“边到边”导致代码的第一个右括号匹配为 {@code.感谢分享。
              【解决方案11】:

              其他两种解决方案的组合似乎很完美:

              * <pre>{@code
              *     {@literal @}Override
              *     public void someMethod() {
              *         Set<String> s;
              *     }
              * }</pre>
              

              即。使用&lt;pre&gt;{@code 开始和}&lt;/pre&gt; 结束sn-p。另外,将@ 替换为{@literal @}

              尚未找到更简单的解决方案。对于一种已经活跃开发了几十年的语言来说,这真是令人难过。

              【讨论】:

                【解决方案12】:

                如果你是 Android 开发者,你可以使用:

                <pre class=”prettyprint”>
                
                TODO:your code.
                
                </pre>
                

                使用 Java 代码在 Javadoc 中漂亮地打印您的代码。

                【讨论】:

                • 请解释一下:考虑到需要@code 标记的问题,Android 工具中的哪些内容可以使这项工作发挥作用?哪个组件应该定义 prettyprint 类? Android 使用常规的 Javadoc。
                • Xamarin/VS,Android Studio,还是没关系?
                • @tyblu Android Studio 可以,但 Xamarin Studio/VS 可能不行。你可以试试。
                【解决方案13】:

                尝试用“pre”替换“code”。 HTML 中的 pre 标记将文本标记为预格式化,并且所有换行符和空格都将完全按照您键入的方式显示。

                【讨论】:

                  【解决方案14】:

                  我用&lt;pre class="brush: java"&gt;&lt;/pre&gt; 标记附上我的示例代码,并使用SyntaxHighlighter 发布的javadocs。它不会损害 IDE 并使已发布的代码示例美观。

                  【讨论】:

                  • 使用 Syntax Highlighter,您必须加载脚本并更正 css。看起来很神奇,但您必须将正确的路径放入所需的脚本和 css。另外,如果想离线使用,一定要注意正确的路径。
                  【解决方案15】:

                  使用 Java SE 1.6,看起来所有 UPPERCASE PRE 标识符都是在 Javadoc 中执行此操作的最佳方式:

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

                  是最简单的方法。

                  我从 java.awt.Event 方法获得的 javadoc 示例:

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

                  这产生的输出看起来与常规代码完全一样,常规代码间距和新行保持不变。

                  【讨论】:

                  • 这不会向现有答案添加任何内容。
                  • madth3,你是对的。我以为我在使用 lower 与 UPPERCASE 前置修饰符时看到了差异,但再看一遍,它看起来不像。它也可能与它在此网页上的显示方式与它在 javadoc 中的显示方式有关。
                  • html标签是否区分大小写?
                  【解决方案16】:

                  至少在 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.
                   ``` */
                  

                  【讨论】:

                    【解决方案17】:

                    我通过这两种方式没有任何问题:

                    <pre>
                    <code>
                     ... java code, even including annotations
                    </code>
                    </pre>
                    

                    <pre class="code">
                     ... java code, even including annotations
                    </pre>
                    

                    当然后者更简单,观察class="code"部分

                    【讨论】:

                      【解决方案18】:

                      从 Java 18 (JEP 413) 开始,您可以使用 @snippet 标签:

                      /**
                       * -- ex: looping through List of Map objects --
                       * {@snippet :
                       * 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"));
                       * }
                       * }
                       *
                       * @param query - select statement
                       * @return List of Map objects
                       */
                      

                      【讨论】:

                        猜你喜欢
                        • 2011-02-07
                        • 1970-01-01
                        • 2013-12-15
                        • 2012-01-19
                        • 2011-06-23
                        • 2014-02-11
                        • 2015-10-07
                        • 2011-02-15
                        相关资源
                        最近更新 更多