有没有办法在Java中将类/方法声明为实验性的?

时间:2019-03-28 16:29:03

标签: java

在开发过程中,我有时会编写仍具有实验状态的类或方法。我想声明这些类,以便可以直接在代码中看到它们。整个过程应该像@Deprecated一样工作。只有相反的意思。

据我所知,Java中没有这样的声明。还是? 如果没有:我如何实现此功能?

2 个答案:

答案 0 :(得分:4)

对于Java 1.6+(不确定1.5),您可以使用自己的自定义注释,这是可以使用的功能模板:

package com.mycompany.annotations;

import java.lang.annotation.*;

/**
 *
 * This element has an experimental maturity.  Use with caution.
 *
 *
 * NOTE: Things like : The developers of this element is not responsible for the issues created,
 * using it is not suggested for production environment. If you see this annotation do this, do not do that etc
 * Enjoy responsibly....
 */


@Documented //this annotation maybe helpful for your custom annotation
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
        ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE, ElementType.PACKAGE, 
        ElementType.ANNOTATION_TYPE, ElementType.TYPE_USE, ElementType.TYPE_PARAMETER
})
public @interface Experimental {}

这里是ElementType的源代码,因此每个人都可能不想使用元素ElementType.TYPE_USE, ElementType.TYPE_PARAMETER

    /*
    ....
        * @since 1.5
        * @jls 9.6.4.1 @Target
        * @jls 4.1 The Kinds of Types and Values
        */
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE,

/** Field declaration (includes enum constants) */
FIELD,

/** Method declaration */
METHOD,

/** Formal parameter declaration */
PARAMETER,

/** Constructor declaration */
CONSTRUCTOR,

/** Local variable declaration */
LOCAL_VARIABLE,

/** Annotation type declaration */
ANNOTATION_TYPE,

/** Package declaration */
PACKAGE,

/**
 * Type parameter declaration
 *
 * @since 1.8
 */
TYPE_PARAMETER,

/**
 * Use of a type
 *
 * @since 1.8
 */
   TYPE_USE
}

通过这种方式,这就是我在搜索可能实现了实验性的库时从IntelliJ中看到的内容

enter image description here

有一个用Java 9定义的Experimental注释。但是请注意,它在Oracle JDK中,而不在OpenJDK中。在撰写本文时,您需要从官方站点安装jdk-11才能查看/使用它。由于列出了Stephen C.的事实,因此我不会将其用于此目的。

无论如何,您不能将其用于方法。因为它的源代码是

... 
package jdk.jfr;

/*
 ...
 *
 * @since 9
 */
@MetadataDefinition
@Label("Experimental")
@Description("Element is not to be shown to a user by default")
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.TYPE })
public @interface Experimental {
}

答案 1 :(得分:3)

最好是实施自己的注释或使用适当的范围来找到合适的第三方等效物。

在JDK 9+中,有一个名为jdk.jfr.Experimental的注释。但是:

  • Java 9之前不包含它。
  • 可能仅适用于支持Java Flight Recorder的Oracle Java实现。
  • 注释的Javadoc表示它具有JFR特定的含义:

      

    说明元素是实验性的,如有更改,恕不另行通知。

         

    可视化Flight Recorder事件的客户端默认情况下不应显示带有“实验”注释的事件或字段。此注释使事件产生者可以自由地尝试新事件而无需提交新事件。

因此 ...在具有非JFR含义的非JFR上下文中重用@jdk.jfr.Experimental是不可取的。 不太可能,任何核心Java工具(除了JFR本身)或第三方工具都将特别注意此注释 1

@jdk.jfr.Experimental的作者也发表了评论:

  

“我同意。该注释是为Flight Recorder设计的,不应在该上下文之外使用。(我是该类的作者)” – Kire Haglin


1-....但是我可能错了。