相关疑难解决方法(0)

如何在Java中识别不可变对象

在我的代码中,我正在创建一个对象集合,这些对象将以各种线程的方式访问,只有在对象是不可变的情况下才是安全的.当尝试将新对象插入到我的集合中时,我想测试它是否是不可变的(如果没有,我会抛出异常).

我能做的一件事就是检查一些众所周知的不可变类型:

private static final Set<Class> knownImmutables = new HashSet<Class>(Arrays.asList(
        String.class, Byte.class, Short.class, Integer.class, Long.class,
        Float.class, Double.class, Boolean.class, BigInteger.class, BigDecimal.class
));

...

public static boolean isImmutable(Object o) {
    return knownImmutables.contains(o.getClass());
}
Run Code Online (Sandbox Code Playgroud)

这实际上让我90%的方式,但有时我的用户会想要创建自己的简单不可变类型:

public class ImmutableRectangle {
    private final int width;
    private final int height;
    public ImmutableRectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public int getWidth() { return width; }
    public int getHeight() { return height; }
}
Run Code Online (Sandbox Code Playgroud)

是否有某种方式(可能使用反射)我可以可靠地检测一个类是否是不可变的?假阳性(认为它不是不可变的)是不可接受的,但是假阴性(认为它是可变的,当它不是)时.

编辑补充:感谢有见地和有帮助的答案.正如一些答案所指出的那样,我忽略了我的安全目标.这里的威胁是无能为力的开发人员 - 这是一个框架代码,将被大量知道线程无关的人使用,不会阅读文档.我不需要为恶意开发者辩护 - 任何聪明到足以变异字符串 …

java functional-programming immutability

41
推荐指数
4
解决办法
2万
查看次数