JavaRush /Blog Jawa /Random-JV /Default Constructor lan Njaga Integritas Kelas ing Jawa
articles
tingkat

Default Constructor lan Njaga Integritas Kelas ing Jawa

Diterbitake ing grup
Nalika ngrancang kelas dimaksudaké kanggo warisan (contone, kelas abstrak), dianggep laku apik ora ngleksanakake antarmuka Serializable, lan mutusaké individu ing saben kelas turunan apa perlu serialized utawa ora. Nanging, kelas kasebut kudu duwe konstruktor standar supaya mekanisme serialisasi bisa nggawe obyek kasebut kanthi bener. Lan kadhangkala ora ana cara kanggo nyedhiyakake konstruktor standar tanpa ngrusak integritas kelas. Konstruktor standar lan njaga integritas kelas ing Jawa - 1Kelas kuwi asring kudu njupuk minangka parameter sawetara obyek tanpa kang ora bisa dienggo kanthi normal, lan nyediakake konstruktor standar bakal nglanggar integritas kelas. Ing kahanan kaya mengkono, sampeyan bisa nyedhiyani konstruktor, nanging nglarang nggarap iku nganti kebak initialized. Kanggo nindakake iki, sampeyan bisa ngenalake negara menyang kelas, lan ngidini metode kasebut diarani mung yen negara kelas iki "diwiwiti". Tuladha saka buku "Jawa Efektif" :
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);
    }
}
Ing wektu sing padha, kabeh cara saka kelas iki kudu mriksa negara saiki kelas lan nyegah nggunakake salah, lan cara readObject()lan kudu ditetepake ing kelas turunan writeObject(). Pranala menyang sumber asli: http://0agr.ru
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION