Как мы замораживаем объект при конструировании объекта с использованием шаблона JavaBeans?

Пройдя через эффективную Java, Джошуа Блох утверждает, что недостатком использования шаблона JavaBeans является то, что объект может находиться в несогласованном состоянии частично через конструкцию и с шаблоном JavaBeans, мы не можем сделать наш класс неизменным. Я это очень понял.

Он также говорит, что мы можем уменьшить эти недостатки, «заморозив» объект, когда его конструкция будет завершена, и не позволит использовать его до заморозки.

Может кто-нибудь помочь мне понять, что означает «замораживание» объекта?

3 голоса | спросил Karan Khanna 18 PMpWed, 18 Apr 2018 14:10:26 +030010Wednesday 2018, 14:10:26

2 ответа


5

Фактически, «замораживание» означает просто исключение большого количества исключений:

  1. Пока объект строится, любая попытка прочитать его (через геттеры или методы) приводит к тому, что создается исключение «все еще создаваемого».
  2. При построении и «замораживании» любые вызовы сеттерам или методы, которые могут изменить состояние, затем приводят к исключениям «мы сейчас заморожены».

Это грязный шаблон, и я не считаю его широко используемым. Шаблон с более длинным рисунком - это шаблон строителя. Идея заключается в том, что у вас есть один объект (строитель), который изменен и может быть построен поэтапно. После завершения он затем испускает неизменяемый объект, который затем используется в последующих операциях.

Если шаблон звучит знакомо, это потому, что именно так работает класс StringBuilder (таким образом, имя).

ответил David Arno 18 PMpWed, 18 Apr 2018 14:18:33 +030018Wednesday 2018, 14:18:33
-1

Замораживание класса будет выглядеть примерно так:

public class Foo
{

    private int a;
    private int b;
    private boolean frozen;

    public int getA()
    {
        return this.a;
    }

    public int getB()
    {
        return this.b;
    }

    public synchronized void setA(final int a)
    {
        checkNotFrozen();
        this.a = a;
    }

    public synchronized void setB(final int b)
    {
        checkNotFrozen();
        this.b = b;
    }

    public boolean isFrozen()
    {
        return this.frozen;
    }

    public synchronized void freeze()
    {
        this.frozen = true;
    }

    private void checkNotFrozen()
    {
        if (this.frozen)
            throw new RuntimeException();
    }

}
ответил Karan Khanna 18 PMpWed, 18 Apr 2018 15:14:32 +030014Wednesday 2018, 15:14:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132