Java中是否存在不受支持的操作注释?

时间:2010-10-27 12:59:55

标签: java annotations

java中是否有任何注释将方法标记为不受支持?例如。假设我正在编写一个实现java.util.List接口的新类。此接口中的add()方法是可选的,我在实现中不需要它们,因此我要执行以下操作:

public void add(Object obj) {
   throw new UnsupportedOperationException("This impl doesn't support add");
}

不幸的是,有了这个,直到运行时才会发现事实上,这个操作不受支持。

理想情况下,这可能是在编译时捕获的,并且这样的注释(例如,可能@UnsupportedOperation)会轻推IDE向该方法的任何用户说“嘿,你正在使用不受支持的操作”使用@Deprecated标记Eclipse以突出显示已弃用项的任何使用方式。

4 个答案:

答案 0 :(得分:10)

虽然从表面上看这听起来很有用,但实际上它并没有多大帮助。你通常如何使用清单?我通常做这样的事情:

List<String> list = new XXXList<String>();

那里已经存在一个间接,所以如果我调用list.add("Hi"),编译器应该如何知道列表的这个特定实现不支持它?

这个怎么样:

void populate(List<String> list) {
    list.add("1");
    list.add("2");
}

现在更难了:编译器需要验证对该函数的所有调用都使用了支持add()操作的列表。

所以不,没有办法做你要求的,对不起。

答案 1 :(得分:4)

如果您熟悉它,可以使用AspectJ来完成。您必须首先创建一个切入点,然后提供建议或声明与此切点匹配的错误/警告关节点。当然,您需要自己的@UnsupportedOperation批注界面。我给出了一个简单的代码片段。

// This the point-cut matching calls to methods annotated with your 
// @UnsupportedOperation annotation.
pointcut unsupportedMethodCalls() : call(@UnsupportedOperation * *.*(..));

// Declare an error for such calls. This causes a compilation error 
// if the point-cut matches any unsupported calls.
declare error: unsupportedMethodCalls() : "This call is not supported."

// Or you can just throw an exception just before this call executed at runtime
// instead of a compile-time error.
before() : unsupportedMethodCalls() {
    throw new UnsupportedOperationException(thisJoinPoint.getSignature()
        .getName());
}

答案 2 :(得分:1)

(2018)虽然在编译时可能无法检测到它,但是可能有替代方法。即,IDE(或其他工具)可以使用注释来警告用户正在使用这种方法。

实际上有一张票:JDK-6447051

从技术的角度来看,实现起来应该比检测非法使用@NotNull@Nullable访问器的检查难得多。

答案 3 :(得分:0)