Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Flyweight图案对象是不可变的吗?_Java_Design Patterns_Immutability_Flyweight Pattern - Fatal编程技术网

Java Flyweight图案对象是不可变的吗?

Java Flyweight图案对象是不可变的吗?,java,design-patterns,immutability,flyweight-pattern,Java,Design Patterns,Immutability,Flyweight Pattern,我们知道,Java intern字符串池是基于Flyweight设计模式的。 字符串对象也是不可变的。是否强制所有使用Flyweight模式的对象都是不可变的。Flyweight模式中可变对象和不可变对象之间的区别是什么?是否强制所有使用Flyweight模式的对象都是不可变的 你可以实现一些看起来像飞锤的东西,但是你的对象很可能是可变的。我认为这是一个糟糕的执行 请参阅评论。不变状态 不变性当然是可取的,仅仅是因为flyweight模式的使用性质。您的客户机可能不知道他们请求/创建的对象实际上

我们知道,Java intern字符串池是基于Flyweight设计模式的。 字符串对象也是不可变的。是否强制所有使用Flyweight模式的对象都是不可变的。Flyweight模式中可变对象和不可变对象之间的区别是什么?

是否强制所有使用Flyweight模式的对象都是不可变的

你可以实现一些看起来像飞锤的东西,但是你的对象很可能是可变的。我认为这是一个糟糕的执行

请参阅评论。不变状态


不变性当然是可取的,仅仅是因为flyweight模式的使用性质。您的客户机可能不知道他们请求/创建的对象实际上是与其他组件或线程共享的,在这种情况下拥有可变对象可能会有问题

记住,GoF设计模式是从20世纪80年代左右编写的代码中收集的。易变性不是今天的问题。考虑到这一点,它们的所有模式都支持可变状态。GoF书中关于可变性的一个注释是删除复合叶节点的间接参考。我会将书中的所有其他对象引用解释为可能是可变的


这并不意味着可变性是可取的,或者模式不可能是不变的。事实上,不变性是应用于设计模式中的一个重要特性,其原因与其他地方的不变性相同。但它在GoF中从来都不是强制性的。

因为对象可能在线程之间共享。所以,为了避免任何并发修改,您必须具有不可变对象。也许还有其他原因,但这是我能想到的主要原因。我认为Java的字符串池是基于Flyweight模式的。