返回null的方法中的java @Nonnull批注

sakis kaliakoudas

我有一个从哈希图中获取内容的方法,一个简化的示例(虽然没有多大意义,但目前已经足够好了)是:

private Map<String,String> map = new HashMap<String,String>();

public String get(String key) {
    return map.get(key);
}

当给定键的条目明显不存在时,此方法可以返回null。事实是,我想对此方法进行注释@NonNull(因为它用在了数不胜数的地方,而且我不喜欢Intellij向我发送有关生产NPE的检查警告,因此我不想关闭该检查,我也不想在每次调用此方法时都检查返回的值是否不同于null,这是因为我总是将此方法与始终在映射中的一堆键一起使用,因此由于程序逻辑,此方法是一定要返回一个@NonNull值。

我很想只用来注释它@NonNull,但是谁知道有人可能用某处定义的键以外的名称来调用它,并实际上导致了NullPointerException。你会怎么办?一个断言听起来很诱人。还是您只是更改该方法以引发RuntimException?还是AssertionError?

谢谢。

编辑:

这是实际的实现:

/**
 * Typesafe heterogeneous container pattern - implementation
 */
public class HandlersMap {

    private final Map<Class<? extends TableHandler>, TableHandler> handlers;

    public HandlersMap() {
        handlers = new HashMap<Class<? extends TableHandler>, TableHandler>();
        putHandler(RolesTableHandler.class, new RolesTableHandler());
        putHandler(UsersTableHandler.class, new UsersTableHandler());
        putHandler(DevicesTableHandler.class, new DevicesTableHandler());
    }

    private <T extends TableHandler> void putHandler(@NonNull final Class<T> type, @NonNull final T instance) {
        handlers.put(type, type.cast(instance));
    }

    @NonNull
    public <T extends TableHandler> T getHandler(@NonNull final Class<T> type) {
        assert handlers.get(type) != null;
        return type.cast(handlers.get(type));
    }

    public Collection<TableHandler> values() {
        return handlers.values();
    }

    public int size() {
        return handlers.size();
    }

    public Map<Class<? extends TableHandler>, TableHandler> getMap() {
        return this.handlers;
    }

}
卢克·胡特曼

@Nonnull没有验证给定密钥是否存在的情况下进行注释绝对是错误的选择。

由于您似乎指示给定的键应该存在,因此这意味着缺少键是无效的参数,因此检查这种情况并IllegalArgumentException为缺少的元素抛出a是正确的做法。

另外,根据映射的初始化方式,您可能需要考虑为键值创建一个枚举,使用aEnumMap代替a HashMap,并让您的get()方法采用该枚举而不是自由格式String这样,您将需要进行一些编译时检查,以确保也使用正确的值。

即使在那种情况下,您仍然需要检查是否存在,以防万一请求的枚举值尚未添加到地图中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单元测试中@Nonnull批注的Intellij IDEA警告

来自分类Dev

java-Spring @Value批注返回null

来自分类Dev

Java批注以确定被批注的方法是否执行

来自分类Dev

@ManagedProperty批注返回null而不是注入属性

来自分类Dev

IntelliJ / Kotlin PSI中的批注与批注条目

来自分类Dev

JavaPoet:如何在批注中构建批注

来自分类Dev

Java EE中的@Producer批注

来自分类Dev

Java EE中的@Producer批注

来自分类Dev

Java批注反射顺序

来自分类Dev

翻译Java批注

来自分类Dev

MATLAB中的LaTeX批注

来自分类Dev

MATLAB中的LaTeX批注

来自分类Dev

Hibernate批注在Java文件中的位置

来自分类Dev

@InjectMocks批注。Java代码模拟

来自分类Dev

Java批注将引发NullPointerException。

来自分类Dev

使用反射获取Java批注

来自分类Dev

@RequestMapping批注中“ params”的含义?

来自分类Dev

了解Hibernate中的mappingBy批注

来自分类Dev

Hibernate @OrderBy批注中的案例

来自分类Dev

Spring中@Service批注的功能

来自分类Dev

JavaScript中的Firebase @DocumentId批注

来自分类Dev

在“实现方法”上禁用@Nonnull 注释

来自分类Dev

Java 8在对象的属性上流nonNull

来自分类Dev

Java批注和Websocket-为什么使用批注代替传统方法?

来自分类Dev

Java批注处理,在与被批注的类相同的包中创建源文件

来自分类Dev

在Spring Component方法上使用@Valid批注

来自分类Dev

@Scheduled批注方法在错误的时间开始

来自分类Dev

Spring Batch Java Config @EnableBatchProcessing批注错误

来自分类Dev

如何解析泛型的Java批注?