You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现简化版Optional类的or()方法:解决私有成员访问问题

解决简化版Optional类or()方法访问私有成员的问题

方案1:直接返回供应商提供的Optional(推荐)

你的or()方法不需要拆包获取私有成员item,因为方法本身的语义就是返回一个Optional实例。按照原生Optional的设计逻辑,当前实例为空时直接返回供应商提供的Optional即可,只需处理泛型类型兼容:

Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
    if (this.item == null) {
        @SuppressWarnings("unchecked")
        Optional<T> other = (Optional<T>) supplier.get();
        return other;
    } else {
        return this;
    }
}

这种方式既避免了访问私有成员,又完全符合or()方法的设计初衷,无需额外包装操作。

方案2:添加公共getter方法访问item

如果确实需要获取item的场景,可以给Optional类添加一个公共的get()方法,通过封装的方式暴露私有成员,同时遵循空值处理逻辑:

class Optional<T> {
    private final T item;
    
    // 已实现的ifPresent()、filter()等方法...
    
    public T get() {
        if (item == null) {
            throw new NoSuchElementException("No value present");
        }
        return item;
    }
    
    Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
        if (this.item == null) {
            T otherItem = supplier.get().get();
            return Optional.of(otherItem);
        } else {
            return this;
        }
    }
}

方案3:调整成员访问权限(不推荐)

可以将item的修饰符从private改为包私有(去掉private,使用默认权限),这样同包内的代码可以直接访问。但这种方式破坏了类的封装性,会暴露内部实现细节,不建议在规范代码中使用。

内容的提问来源于stack exchange,提问作者Disdainty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:15:38