JavaRush /Java Blog /Random-KO /Java의 기본 생성자 및 클래스 무결성 유지
articles
레벨 15

Java의 기본 생성자 및 클래스 무결성 유지

Random-KO 그룹에 게시되었습니다
Serializable상속을 위한 클래스(예: 추상 클래스)를 설계할 때 인터페이스를 구현하지 않고 각 하위 클래스에서 직렬화해야 하는지 여부를 개별적으로 결정하는 것이 좋습니다 . 그러나 직렬화 메커니즘이 개체를 올바르게 생성하려면 이러한 클래스에 기본 생성자가 있어야 합니다. 그리고 때로는 클래스의 무결성을 손상시키지 않고 기본 생성자를 제공할 수 있는 방법이 없습니다. Java의 기본 생성자 및 클래스 무결성 유지 - 1이러한 클래스는 일반적으로 정상적으로 작동할 수 없는 일부 개체를 매개 변수로 사용해야 하며 기본 생성자를 제공하면 클래스의 무결성을 위반하게 됩니다. 이러한 상황에서는 생성자를 제공할 수 있지만 완전히 초기화될 때까지 생성자 작업을 금지할 수 있습니다. 이를 위해 클래스에 상태를 도입하고 이 클래스의 상태가 "초기화"된 경우에만 해당 메서드가 호출되도록 허용할 수 있습니다. "Effective Java" 책의 예 :
public abstract class AbstractFoo {
    private int x, y;

    private enum State {
        NEW, INITIALIZING, INITIALIZED
    };

    private final AtomicReference<State> init = new AtomicReference<State>(State.NEW);

    protected AbstractFoo() {}

    public AbstractFoo(int x, int y) {
        initialize(x, y);
    }

    protected final void initialize(int x, int y) {
        if (!init.compareAndSet(State.NEW, State.INITIALIZING)) {
            throw new IllegalStateException("Already initialized");
        }
        this.x = x;
        this.y = y;
        init.set(State.INITIALIZED);
    }

    protected final int getX() {
        checkInit();
        return x;
    }

    protected final int getY() {
        checkInit();
        return y;
    }

    private void checkInit() {
        if (init.get() != State.INITIALIZED) {
            throw new IllegalStateException("Uninitialized");
        }
    }
}

class Foo extends AbstractFoo implements Serializable {
    private void readObject(ObjectInputStream s) throws IOException,
            ClassNotFoundException {
        s.defaultReadObject();
        int x = s.readInt();
        int y = s.readInt();
        initialize(x, y);
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        s.writeInt(getX());
        s.writeInt(getY());
    }

    public Foo(int x, int y) {
        super(x, y);
    }
}
동시에 이 클래스의 모든 메소드는 클래스의 현재 상태를 확인하여 잘못된 사용을 방지해야 하며, 메소드 readObject()및 메소드는 하위 클래스에 정의되어야 합니다 writeObject(). 원본 소스 링크: http://0agr.ru
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION