可变或不可变的类?

Sil*_*ior 9 java scalability immutability

我在一些设计书中读到,不可变类提高了可伸缩性,并且尽可能地编写不可变类.但我认为如此不可改变的阶级会增加对象的扩散.因此,为了提高可伸缩性,使用静态类(具有所有静态方法的类)更好地进行不可变类或更好吗?

cle*_*tus 12

但是,不可变类的主要好处是可以公开不可变的内部数据成员,因为调用者无法修改它们.例如,这是一个巨大的问题java.util.Date.它是可变的,因此您无法直接从方法返回它.这意味着你最终会做各种防御性复制.这增加了对象的扩散.

另一个主要好处是根据定义,不可变对象没有同步问题.这就是可伸缩性问题的来源.编写多线程代码很难.不可变对象是(大多数)绕过问题的好方法.

至于"静态类",通过你的评论,我认为它是指具有工厂方法的类,这是通常描述的方式.那是一种无关的模式.可变类和不可变类都可以具有公共构造函数或具有静态工厂方法的私有构造函数.这对类的(im)可变性没有影响,因为可变类是在创建后可以更改其状态的类,而在实例化后不能更改不可变类的状态.

然而,静态工厂方法可以具有其他好处.想法是封装对象创建.


Ima*_*ist 5

不可变类确实会促进对象扩散,但是如果你想要安全,可变对象会促进更多的对象扩散,因为你必须返回副本而不是原始副本以防止用户更改你返回的对象.

至于使用所有静态方法的类,在大多数可以使用不变性的情况下,这不是一个真正的选项.从RPG中获取此示例:

public class Weapon
{
    final private int attackBonus;
    final private int accuracyBonus;
    final private int range;

    public Weapon(int attackBonus, int accuracyBonus, int range)
    {
        this.attackBonus = attackBonus;
        this.accuracyBonus = accuracyBonus;
        this.range = range;
    }

    public int getAttackBonus() { return this.attackBonus; }
    public int getAccuracyBonus() { return this.accuracyBonus; }
    public int getRange() { return this.range; }
}
Run Code Online (Sandbox Code Playgroud)

您如何使用仅包含静态方法的类实现此操作?