Зачетох се в главата и следните неща ми направиха впечатление:
неправилна променлива:
1) public void stop() {
long
endTimeInNanoseconds = System.nanoTime();
this.milliseconds +=(
endTimeInNs - startTimeInNs) / 1000000;
}
2) ники е писал тоя 100000 да се кръсти nanosecondsInSeconds, а трябва да е nanosecondsInMilliseconds.
А сега по въпросите
1. Имплементацията със статичен инър клас е яка. Ако трябва да има втори интерфейс, той къде ще се сложи? Ще са два ненаследяващи се интерфейса (един за съхранителя на състоянието и един за Оригинатора), или единия ще наследява другия?
Ако са ненаследяващи са, тоест равнопоставени, то тогава Съхранителят не би трябвало да знае за втория (за вътрешна употреба) интерфейс. И така или иначе ще има instanceof и кастване вътрешно (тоест реално вторият интерфейс не се ползва за ООП абстракция). Ако са наследяващи са, то зависи кой е по-надолу в йерархията, в единия случай Съхранителя ще има достъп до тези методи, в другия пак има instanceof (при подаване на състоянието на нов Оригинатор (мементо) обект).
Ники, ти казваш, че ако има втори интерфейс, то Съхранителя може да направи instanceof и да пипа вътре. Поне аз така разбирам думите ти. Ама Съхранителя ако иска да пипа вътре, нищо не може да го спре. Спринг например като си прави проксита и им слага допълнителни интерфейси, но те не нарушават абстракцията, защото _не би трябвало_ някой да ги пипа.
Тоест според мен втория интерфейс би бил нужен само откъм по-ясно открояване на това кой каква роля има и какво може да пипа.
Кратка първа имплементация с два интерфейса и instanceof не пречи да се сложи първо, но само за яснота. Аз се сещам само за instanceof при смяна на интерфейсите, през които се работи с даден клас. Има ли друг по-елегантен начин? Може с package-local, package-private, friendly полета в отделен пакет? Но пак няма да е много чисто. Това с вътрешния клас е най-добро. За жалост се работи с клас, а не с интерфейс.
2.Да може да се restore-ва различен обект от създателя на сеттингс, според мен, е важно да може да се прави. Имплементационно разликата е малка, но е по-мощно. Говоря за коментар 21, 22 в главата. А там вместо нова инстанция може да се ползва сингълтън, но тогава реално няма нужда от мементо. Та освен нов обект, не виждам как иначе може да се процедира.
:)
Михаил