Element einer Klasse als readonly deklarieren?



  • Ich würde gerne in einer klasse ein Attribut haben können, das von den anderen Programmen zwar gelesen, aber nicht verändert werden kann. Wenn ich es als private deklariere, und eine getWert methode implementiere können die anderen Programme aufgrund der referenzierten Rückgabe auch das Objekt verändern, und das würde ich gerne verhindern.



  • Geht nur bei primitiven Attributen (durch final).


  • Mod

    Du könntest Wertesemantik nutzen bzw. defensive Kopien machen:

    public MyObject getMyObject()
    {
       return new MyObject(myPrivateObject);
    }
    

    Eine andere Möglichkeit ist, einen Wrapper um das Objekt herum zu schreiben, der praktisch eine Schnittstelle zu den readonly-Methoden darstellt. Dann verpackst Du das Objekt in dem Wrapper und gibst bei so einer Methode den Wrapper zurück. In diesem Fall bleiben die Daten auch zeitlich mit dem Zustand Deines Objekts konsistent.



  • Gregor schrieb:

    Du könntest Wertesemantik nutzen bzw. defensive Kopien machen:

    public MyObject getMyObject()
    {
       return new MyObject(myPrivateObject);
    }
    

    das geht nicht, denn es ist nicht standartmäßig ein konstruktor gegeben, der aus einem Objekt des gleichen typs ein neues macht.
    Die andere Methode habe ich nicht so richtig verstanden



  • Krux schrieb:

    Gregor schrieb:

    Du könntest Wertesemantik nutzen bzw. defensive Kopien machen:

    public MyObject getMyObject()
    {
       return new MyObject(myPrivateObject);
    }
    

    das geht nicht, denn es ist nicht standartmäßig ein konstruktor gegeben, der aus einem Objekt des gleichen typs ein neues macht.
    Die andere Methode habe ich nicht so richtig verstanden

    Du musst ja nicht mit genau so einem Konstruktor das Object kopieren. Vlt. ist es ja Cloneable? Oder du erstellst halt mit den gegebenen Konstruktoren das Object mit den gleichen Daten, wie das Orginal.


Anmelden zum Antworten