Frage

Dies ist ein Beispiel für defensive Kopie in effektiver Java. Nehmen Sie an, dass das Szenario in meinen zugrunde liegenden Fragen eine defensive Kopie benötigen, und nicht mit einem Kommentar, der den Client bittet, um mutierende Objekte zu vermeiden, die eingeleitet werden.

generasacodicetagpre.

Fragen:

    .
  1. was zu tun ist, wenn Date keinen Konstruktor hatte, um sich selbst zu nehmen, um mein Selbst allgemeiner zu gestalten, wird ein Objekt mit keinem Mechanismus, um sich selbst zu replizieren, und ein solches Objekt gehört nicht zu uns, dh wir kann es nicht in irgendeiner Weise ändern?

  2. Was ist, wenn der Konstruktor den Typ-Parameter als Argument aufgenommen hat, sagen, dass generationstabeticetagcode und t versetzbar sein könnten, so dass defensive Kopie benötigt. Wir haben keine Ahnung von dem, was T. Wie man defensive Kopie in diesem Fall macht?

  3. Was ist eine Schnittstelle, an der ein Teil seiner Unterklassen einen Konstruktor wie Period(T object) hat, um ein Objekt von sich selbst zu erstellen, und einige seiner Unterklassen haben keinen Mechanismus dazu?

  4. Wie tief sollen wir defensiv kopieren? Mal können wir ein Array kopieren, aber Array-Elemente waren veränderbar?

War es hilfreich?

Lösung

    .
  1. Wenn der gesamte Status verfügbar ist, können Sie seinen Status extrahieren und ein neues Objekt selbst erstellen. Ansonsten können Sie nichts darüber tun, außer mit bösen Reflexions- oder Serialisierungsricks.
  2. Wenn t keine Instanz einer Klasse ist, die das Kopieren selbst ermöglicht, können Sie nichts tun.
  3. Sie können nichts dagegen tun.
  4. es hängt davon ab.
  5. Wenn Sie Ihre Frage lesen, sieht es aus, als würden Sie überall die "defensive Kopie" anwenden. Du solltest nicht Meistens möchte der Code mit veränderbaren Objekten einen Verweis auf das Originalobjekt und keine Kopie. Insbesondere wenn Sie, was Sie als Argument bekommen, ein Beispiel einer abstrakten Klasse oder einer Schnittstelle ist.

    Sie sind gezwungen, eine defensive Kopie des Datums vorzunehmen, da der Müllwerttyp ist, der nicht veränderbar sein sollte, und wäre nicht, wenn es ordnungsgemäß gestaltet wurde. Wenn Sie die Unvermutungsfähigkeit für Werttypen fördern, werden defensive Kopien unnötig. Bei Nicht-Wert-Typen möchten Sie im Allgemeinen keine Kopie, sondern einen Hinweis auf das Objekt.

Andere Tipps

    .
  1. Wenn Sie den Status des Objekts sowieso nicht ändern können, benötigen Sie keine defensive Kopie.
  2. Das einzige, was Sie tun können, ist eine wahrscheinliche Implementierung von T, und überprüfen Sie sie mit Instanzfolie .
  3. gleich wie 2.
  4. nach Ihrem Ermessen.Wenn Sie davon ausgehen, dass die Modifikation von Array-Elementen Ihr Programm an anderen Orten brechen könnte, sollten Sie sie auch kopieren.

Defensive Programmierangelegenheiten Wenn die Objekte, die Sie an ein Verfahren übergeben, veränderbar sind.Eine gute Praxis (auch im effektiven Java-Buch beschrieben) ist, sie unveränderlich zu machen.

    .
  1. Wenn die Datumsklasse nicht endgültig ist, können Sie eine Wrapper-Klasse dafür schreiben, dh die Unterklasse des Datums.
  2. es hängt davon ab.Wahrscheinlich ist es nicht notwendig, es zu klonen.
  3. es sollte dich nicht stören.Der Implementiergerät einer Schnittstelle sollte sich um Synchronisationsprobleme kümmern.Im Allgemeinen ist es eine gute Praxis, Schnittstellen anstelle ihrer Implementierungen zu bestehen.
  4. Für Standard-Java-Kollektionen gibt es in der Java.Util.Collections-Klasse von Java.Util.Collections, z. B. unmodifiablelist und unmodifiasticapap, für die defensive Programmierung.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top