实现简化版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
相关产品推荐
相关产品推荐

