gpt4 book ai didi

java - guava的ImmutableList并不是真的不可变

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:13 26 4
gpt4 key购买 nike

ImmutableListdocumentation says :

Although this class is not final, it cannot be subclassed as it has no public or protected constructors.

我知道这有点牵强,但可以在 com.google.common.collect 包中创建 ImmutableList 的子类(因为它的构造函数是不是私有(private)的,而是包私有(private)的)这是可变的。从那时起,任何获得对 ImmutableList 引用的人都不能确定它确实是不可变的。这不会破坏 ImmutableList 的目的吗?

最佳答案

归根结底,Guava 只是您正在执行的一堆二进制文件。你可以用它做任何你想做的事,包括违反代码提供的契约。

您可以:

  • 运行破坏 Guava 的自定义 JVM
  • 运行一个单独的应用程序并操纵 JVM 的物理内存并破坏 Guava
  • 操纵Guava字节码并破解Guava
  • 配置类加载器加载其他字节码并破解 Guava
  • 调用 sun.misc.Unsafe 来破解 Guava
  • 使用反射破解Guava
  • 滥用包层次结构并破坏 Guava

仅举几例。这些都不是新颖的,unique to Guava , 或 unique to Java .这是你的机器,你应该能够做这些事情。当然,你能做什么和你应该做什么是截然不同的事情。以任何这些方式滥用 Java 都会给您和任何其他试图运行您的代码的人带来问题。

Java 类型系统,包括可见性限制,不是警察。它的存在是为了帮助您编写易于使用的高质量代码。 Guava 利用 Java 的记录行为为您提供更多工具,使您能够编写更易于使用的更高质量的代码。如果您选择破坏工具,那是您的特权。但是不要指望任何人想要使用您的代码。


具体解决这一点:

it's possible to create a subclass of ImmutableList in com.google.common.collect package (since its constructor is not private, but package private) which is mutable.

无需太多工作,您就可以以几乎相同的方式将私有(private)构造函数类操纵为可变的。正如我上面提到的,滥用包层次结构只是您不应该做的许多事情之一。如果您不相信一段第三方代码在这方面表现良好,则不应使用它。

关于java - guava的ImmutableList并不是真的不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17942636/

26 4 0