java - 明确区分对象的不可变部分和可变部分是好的设计吗?

标签 java composition mutability

让我们考虑一下这个类,其中 ImmutablePart 是一个不可变的纯数据 Object :

public class Clazz1  {
    private final ImmutablePart immu ;

    private String f1;

    private boolean f2;

    private int f3;

    /** some constructor building up the immu and 
    setting the fields to init values
    ...
    ...
    **/

    public ImmutablePart getImmu(){return immu;}

    public String getF1(){return f1;}

    public boolean getF2(){return f2;}

    public int getF3(){return f3;} 

    public void setF1(String f1){this.f1=f1;}

    public void setF2(boolean f2){this.f2=f2;}

    public void setF3(int f3){this.f3=f3;}         
}

在这个阶段使用组合是一种很好的做法,可以更清楚地表明一个部分是可变的,另一个是不可变的,或者它只是样板?像这样(MutablePart 具有用于 Clazz1 字段的 getter 和 setter)。

public class Clazz2  {
    private final ImmutablePart immu ;

    private final MutablePart mutable;

    /** some constructor building up the two final objects
    ...
    ...
    **/

    public ImmutablePart getImmu(){return immu;}

    public MutablePart getMutable(){return mutable;}

}

编辑1:可以更具体地说,不可变部分是从包含某种元信息的文件构建的,因此并不意味着要更改。可变部分将根据运行时而演变。假设我正在开发一个 p2p 应用程序。不可变部分将包含有关我的客户端将与同行共享的文件集的所有信息,以及一些哈希键以确保接收到的数据包的真实性。而可变部分将包含有关共享状态的信息,即一些状态、上传的字节数、下载的字节数等......不可变部分可以很容易地称为“元信息”,而可变部分可以称为“上下文”,如果你想要更有意义的名字。但我的问题更多的是关于这种设计的实用性。感谢您的回答!

EDIT2:我选择的名称只是出于抽象目的,我会在实际实现中给出更好的名称。也就是说,我同意乍一看可能会令人困惑,通过说“显式”,我的意思是把两个部分严格区分为两个不同的对象,而不是明确地将一个部分命名为“不可变”而另一部分“可变”。

最佳答案

根据您的详细程度,这无法决定,但如果有一些额外的要求,这样的拆分可能是可取的。

具体来说,可变部分和不可变部分之间的划分是享元模式的本质:您可以在相同状态下需要它的所有实例之间自由地重用不可变部分。

您还可以自由地将不可变部分发布给任何感兴趣的各方,而不会破坏任何内部结构。

此外,如果您需要深度克隆对象,这可能会有所帮助。不可变部分将在克隆之间共享。

关于java - 明确区分对象的不可变部分和可变部分是好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26495620/

相关文章:

amazon-web-services - 用于 AWS Elasticache 的 JAVA API

c++ - 私有(private)继承的组合

haskell - 实现 curry 功能

parsing - 如何在 Rust 中为我自己的解析器编写组合器?

c# - 在 C# 中返回 IList<T> 与数组?

iterator - 如何从一个范围创建一个 Vec 并对其进行洗牌?

java - tooltipText bug 导致 JMenuItem 失去焦点

Java:WAITING所有子进程完成

java - 小程序在安全阶段在 IE 中挂起

rust - 为什么给定 HashMap 中的值是可变的,而我不认为我已经明确声明了它们?