首页 > 解决方案 > 将表达式分配给局部变量时如何防止Eclipse生成类型注释

问题描述

假设我有这样的 Java 代码:

package test;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

public class Test {

    @NotNull
    public static Object object() {
        return new Object();
    }

    public static void test() {
        object();
    }
}

@Target({ ElementType.METHOD, ElementType.TYPE_USE })
@interface NotNull {}

当我在“object();”上使用快速修复 ( Ctrl+ 1) 操作“将语句分配给新的局部变量”时 打电话,我得到这个:

public static void test() {
    @NotNull
    Object object = object();
}

我不想在我的客户端 Java 代码中添加注释,因为它对我来说只是噪音。我怎样才能防止它一直被生成,而是得到它?

public static void test() {
    Object object = object();
}

所有这一切都只发生在注释有 时@Target(TYPE_USE),并且只有在org.eclipse.jdt.core.compiler.compliance=8或以后.settings/org.eclipse.jdt.core.prefs

作为记录,我还提交了增强请求 565463

(现实世界的 API 正在声明此类注释以实现更好的 Kotlin 互操作性(使用 JetBrains 注释),因为 Kotlin 可以使用它来区分TandT?和避免T!

标签: javaeclipseannotations

解决方案


当且仅当未启用或错误配置基于注释的空分析@NotNull时,才会添加在您的情况下不需要的。

Project > Properies: Java > Compiler部分Null analysis中:

  1. 确保选中启用基于注释的空分析复选框
  2. 而不是选中Use default annotation for null specification复选框,单击Configure...链接并将(或)配置为test.NotNull“NonNull”注释org.jetbrains.annotations.NotNull

请注意,只会添加ElementType.TYPE_USE注释。对于带有ElementType.TYPE_USE注解的方法(不能添加到void方法中),注解指的是返回类型,而不是方法本身。换句话说,当调用这样的方法时,您会得到一个带注释的对象。对我来说,为变量的类型添加使用类型注释是预期的行为。

只有在您的情况下具有两个目标的注释. 注释是指返回类型(因此添加它是有意义的)还是方法是指方法本身(因此不应添加)?ElementType.TYPE_USEElementType.METHOD

请不要也,相反org.jetbrains.annotations.NotNull org.eclipse.jdt.annotation.NonNull没有目标ElementType.METHOD。方法声明怎么可能null?方法的意义是什么@NotNull?根据( "... null value is allowed to return (for methods)..." )的Javadocorg.jetbrains.annotations.NotNull,目标似乎在​​这里被错误地添加了,因为它没有引用方法声明ElementType.METHOD


推荐阅读