gpt4 book ai didi

java - 检查对象是否是 protected 类的实例

转载 作者:行者123 更新时间:2023-11-30 09:03:58 24 4
gpt4 key购买 nike

假设我正在使用具有以下方法的 Java 库

public static SomeInterface foo();

SomeInterface 接口(interface)有多个实现,其中一些在库包中受到保护。其中一个实现是 TheProtectedClass

检查 foo() 返回的对象是否是 TheProtectedClass 实例的最佳方法是什么?

我目前的计划是创建一个 Utils 类,该类存在于我的项目中,但与 protected 类位于同一包中。这个 Utils 可以引用 TheProtectedClass,因为它在同一个包中,因此它可以检查对象是否是 instanceof TheProtectedClass

还有其他想法吗?

编辑:有些人在问“为什么”,所以这里有更多的上下文。

我正在使用 jOOQ在我的代码的某些部分,我想知道 Field 是否我拥有的实例是 Lower 的一个实例.

目前,我使用 field.getName().equals("lower") 但这并不像我希望的那样健壮。

我意识到由于 Lower 是一个 protected 类,它不是 API 的一部分并且它可以更改,但我同意这一点。

最佳答案

Class.forName("TheProtectedClass").isAssignableFrom(foo())

尽管出于多种原因这是一个坏主意。你在这里打破了封装和抽象。如果它是包私有(private)的,你不应该在外面关心它。如果它受到保护,您应该显式继承它并使用类为这种情况提供的 API。

不太明显但更正确的解决方案是获取 TheProtectedClass 的实例,并将其与

guaranteedTPCInstance.getClass().isAssignableFrom(foo())

,虽然仍然有点 hacky,但至少更便携和 OOPy IMO。

关于您在与 TheProtectedClass 相同的包中创建一个类以避免包私有(private)的想法 - 这是一个可行的解决方案,但是 a) 它打破了封装的基本原则和 TPC 类的编程契约;打包由库/类作者完成是有原因的——为了防止不负责任的数据访问和使用私有(private) API 或未记录的专有方法,b) 它并不总是可能的(并且不应该在适当的情况下是可能的)设计的库类),因为这些类不仅可以是包私有(private)的,而且可以是 final 或有效的 final(匿名内部类等)——出于 Bloch 在 EJ 2nd 中描述的原因,“支持组合而不是继承"项目,另见 Good reasons to prohibit inheritance in Java? Use of final class in Java等等 c)你不能用一些Java库类来做,因为你不能定义你的类并使用例如java.lang 包。因此,唯一的“可移植”解决方案是通过反射(reflection)和我所描述的内容。

tl;dr 事实上,你可以通过模仿另一个包的包定义来搭载另一个包,这是 Java 语法的一个明显的 C 风格缺陷(允许程序员做他通常不应该做的事情;一些特定的反射(reflection)也是如此方法);以这种方式进行的黑客攻击既不可维护也不安全。

注意:如果您希望在内部实现依赖中做某事,同时可移植可维护(例如,不受实现更改/类名更改等的影响)方式,您显然期望不可能。

关于java - 检查对象是否是 protected 类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25407260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com