gpt4 book ai didi

java - 强制不变性

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:16 25 4
gpt4 key购买 nike

我们都熟悉不变性。一个非常简单的不可变类是

final class Immutable {
public final float PI = 3.14;
}

这真的是一成不变的吗?难道Java开发者真的无法修改PI ?不,他们可以使用Reflection API来访问和修改PI 。然而,由于这是访问字段的非正统方式,尽管可以使用安全管理器阻止通过反射 API 进行的修改(对吗?),我们说 Immutable即使没有激活安全管理器也是不可变的。

interface ImmutableName {
public String getName();
}

class MutableName implements ImmutableName {
private String name;
public String getName() { return name; }
public void setName(String val) { name = val; }
}

如果我都有MutableName实例称为ImmutableName实例,开发人员修改 name 。实际上,开发人员可以检查实例的运行时实现,然后将实例向下转换为 MutableName 。向下转型在 Java 中比反射 API 更常见,但这难道不是一些非正统的技巧吗?类设计者是否应该针对向下转型进行防御性编码?

最佳答案

你需要正确看待事情。

是的,从技术上讲,编写会干扰我们通常认为不可变的类的代码是可能的。 (如果有人这样做,JLS 会明确表示该行为并未指定。)

但这是众所周知的。这通常不是问题,因为:

  • 除非绝对必要,否则负责任的程序员不会做这种事。
  • 我们的大多数同事、同事等都有责任。

那么,如果您真的认为有人可能会编写疯狂/不正当的代码来执行此操作,您会怎么做?

解决方案:

  1. 将他们的代码视为不可信并将其放入沙箱中。
  2. 对您需要信任的代码进行全面审查。

好吧,这两种方法都不是无懈可击的。但 IT 世界里什么都没有。 (除非您愿意将系统与互联网断开并在法拉第笼中工作。这有时是必要的......但对于普通人来说不是一个可取的方法。)

<小时/>

就其值(value)而言,Java 语言和 Java 虚拟机设计是在保持事物安全和简单(一方面)与为程序员提供以性能的名义做聪明且(偶尔)危险的事情的能力之间的折衷。如果语言设计者“全力以赴”强制执行诸如不变性之类的事情:

  • 该语言目前的大部分用途都不实用1
  • 许多应用程序的性能没有竞争力2,并且
  • 它可能无论如何都行不通3
<小时/>

1 - 所需的限制也会使 Java 开发人员/库所依赖的其他事情变得不可能。例如,用于实现 DI 框架、序列化绑定(bind)、远程处理等的 jvm 功能。

2 - 没有不安全。没有 native 代码。

3 - 聪明的开发人员最终会找到解决方法。

关于java - 强制不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51343974/

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