gpt4 book ai didi

java - 检查私有(private)静态内部类的实例

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:27 25 4
gpt4 key购买 nike

问题的标题听起来像是一个很好的思想实验。可悲的是它不是。让我们假设以下代码结构:

class Outer {
private static class Inner implements SomeInterface {
...
}
public static SomeInterface returnInner() {
return new Inner();
}
}

是否有一种好的、干净的方法来执行以下检查:

SomeInterface a  = A.returnInner();
if (a instanceof Outer.Inner)
throw new Error("Ooops, something bad happened");

您认为这不是现实生活中的例子吗?检查 Arrays类和方法 asList(T ...)它返回自己的 List<T>实现,恰好是一个 private static class ArrayList<T> (这与通常的 ArrayList 无关——感谢 Sun 和 Oracle,没有你们我该怎么办)。我需要检查传递给我的方法的对象是否不是这个包装类的实例,因为它没有实现 add()方法(它使用 AbstractList 的实现 - 它抛出一个 UnsupportedOperationException )。

最佳答案

Is there really no good way of checking this? Even through some reflection magic?

有一种方法,但无论如何都不是一个好方法:

// WARNINIG: This is very fragile, please try avoiding code like this.
if (theirList.getClass().getEnclosingClass() != null) {
// theirList is an instance of an inner class
}

问题不是做起来难,而是结果变得很不可靠:

  • 此代码拒绝 List<T> 的可变实现 - 例如,如果您决定推出自己的嵌套类实现 List<T> , 它会被拒绝
  • 此代码将接受顶层只读实现 - 如果有一天 Oracle 决定将实现移至顶层,您的代码将停止工作。

由于这些原因,最好尝试添加到类中,捕获异常,并在调用者向您传递一个只读列表时采取您打算采取的任何替代方法。

关于java - 检查私有(private)静态内部类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39415947/

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