2016-12-11 5 views
0

Mutation verwirrt mich immer noch von Zeit zu Zeit.Ist ein Objekt, das einen festen Satz veränderbarer Objekte enthält, veränderbar?

Wenn ich ein Objekt habe, das einen festen Satz veränderbarer Objekte enthält. Halten Sie dieses Objekt für veränderlich?

Beispiel: Ich habe ein Objekt namens Puzzle, das eine feste Menge von Stücken enthält. Die Stücke sind veränderbar. Zum Beispiel können sie verkehrt herum sein und ihre Ausrichtung kann sich ändern. Angenommen, Sie können in diesem Beispiel keine Teile verlieren (wenn das nur im wirklichen Leben der Fall wäre ...), denke ich, dass das Puzzle-Objekt immer noch unveränderlich ist, oder?

Antwort

3

Aus Wikipedia: In der objektorientierten und funktionalen Programmierung ist ein unveränderliches Objekt (unveränderbares Objekt) ein Objekt, dessen Status nach der Erstellung nicht geändert werden kann. Dies steht im Gegensatz zu einem veränderbaren Objekt (änderbares Objekt), das nach der Erstellung geändert werden kann.

In Ihrem Beispiel ist das Puzzle-Objekt veränderbar, da Sie den Status eines seiner Teile ändern können.

+0

Okay, ein unveränderliches Objekt kann also keine veränderbaren Objekte enthalten? Es ist eine Art von Vererbung beteiligt. Folglich ist Unveränderbarkeit ein bisschen schwieriger zu erreichen, als ich dachte. Vielen Dank! – MWB

+0

Korrigieren. Wenn das Objekt unveränderbar sein soll, kann es keine veränderbaren Objekte enthalten. Technisch ist es möglich, diese veränderbaren Objekte privat zu machen und sie so zu kapseln, dass sie nicht verändert werden können und man Unbeweglichkeit erreichen würde, aber das hängt wirklich vom Anwendungsfall ab. –

1

Nein. Das Objekt wäre veränderbar. Eine wichtige Sache mit Unveränderlichkeit ist, dass (reine) Funktionen, die das Objekt als Parameter annehmen, bei jedem Aufruf den gleichen Wert zurückgeben. Dies wäre nicht der Fall, wenn das Objekt veränderbare Eigenschaften enthält. Betrachten Sie folgendes Beispiel:

A wandelbar Klasse:

class Counter { 
    private int count = 0; 

    public int getCount() { 
     return count++; 
    } 
} 

Ein "unveränderlich" Klasse:

class Container { 
    private final Counter theCounter = new Counter(); 

    public Counter getCounter() { return theCounter; } 
} 

Und eine scheinbar reine Funktion, die einem auf Container arbeitet:

public int getCount(Container container) { 
    return container.getCounter().getCount(); 
} 

Also, wenn Container unveränderlich war, würden Sie daserwartenwürde den gleichen Wert zurückgeben, wenn dieselbe Container zweimal übergeben wurde. Aber das ist nicht der Fall.

Container container = new Container(); 
getCount(container); // Returns 0. 
getCount(container); // Returns 1. 
0

Nein, ein Objekt kann nicht unveränderbar sein, wenn es mindestens ein veränderbares Objekt enthält. Hier sind die Stücke veränderbar. So kann Puzzle nicht unveränderlich sein.

Wenn Sie Puzzle unveränderlich machen wollen, einige, wie die Stücke unveränderlich nach der Anforderung machen.

+0

In meinem Beispiel ist es nicht einfach, Stücke unveränderlich zu machen. Der Spieler muss in der Lage sein, die Teile zum einen zu drehen. – MWB

+0

Anstatt das tatsächliche Stück zu mutieren, können Sie eine Funktion 'rotieren' haben, die ein neues Stück zurückgibt, das gedreht wird. Es gibt immer einen Weg, um eine Klasse unveränderlich zu machen. – marstran

+0

Ich denke ... aber irgendwie sagt mein Bauchgefühl, dass das nicht der richtige Weg ist. Vielleicht bin ich zu sehr an echte Puzzles gewöhnt, bei denen man nicht herumgeht, wenn man ein Stück dreht, um neue Stücke zu kreieren. Also ich schätze meine Folgefrage für dich: Ja, es ist möglich, aber würdest du? – MWB

Verwandte Themen