- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们都熟悉不变性。一个非常简单的不可变类是
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 会明确表示该行为并未指定。)
但这是众所周知的。这通常不是问题,因为:
那么,如果您真的认为有人可能会编写疯狂/不正当的代码来执行此操作,您会怎么做?
解决方案:
好吧,这两种方法都不是无懈可击的。但 IT 世界里什么都没有。 (除非您愿意将系统与互联网断开并在法拉第笼中工作。这有时是必要的......但对于普通人来说不是一个可取的方法。)
<小时/>就其值(value)而言,Java 语言和 Java 虚拟机设计是在保持事物安全和简单(一方面)与为程序员提供以性能的名义做聪明且(偶尔)危险的事情的能力之间的折衷。如果语言设计者“全力以赴”强制执行诸如不变性之类的事情:
1 - 所需的限制也会使 Java 开发人员/库所依赖的其他事情变得不可能。例如,用于实现 DI 框架、序列化绑定(bind)、远程处理等的 jvm 功能。
2 - 没有不安全
。没有 native 代码。
3 - 聪明的开发人员最终会找到解决方法。
关于java - 强制不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51343974/
我是一名优秀的程序员,十分优秀!