Właściwie podczas kompilacji muszę wiedzieć, że zmienia się lista niemodyfikowalna.
To nie jest możliwe.
Przynajmniej nie jest to możliwe bez utworzenia zupełnie innego interfejsu kolekcji/hierarchii klas. I to jest zły pomysł, ponieważ nic nie zaprojektowane do korzystania z regularnych kolekcji będzie z nim pracować.
Przypuszczam, że możliwe byłoby napisanie statycznego analizatora kodu, który mógłby wykryć tego rodzaju rzeczy ... w niektórych przypadkach ... ale to nie jest ściśle "czas kompilacji". Poza tym nie jestem świadomy żadnego istniejącego statycznego analizatora kodu, który robi to "po wyjęciu z pudełka".
Zastanawiam się, czy istnieje powód, dlaczego zrobili to w ten sposób.
Cóż, żaden ze sposobów, w jaki nie może zrobić to naprawdę działa.
Alternatywa # 1:
public interface UnmodifiableList<T> {
public T get(int pos);
....
}
public interface List<T> extends UnmodifiableList<T> {
public void add(T elem);
....
}
podczas pisania statyczna może uniemożliwić nam za pomocą niemodyfikowalne listy gdzie wymagany jest jeden modyfikowalny, odwrotna nie jest prawdziwa. Każda lista jest również UnmodifiableList ... i to naprawdę nie ma sensu.
Alternatywa 2:
public interface List <T> {
public T get(int pos);
public void add(T elem);
....
}
public interface UnmodifiableList<T> {
// A marker interface
}
Teraz statyczne typowanie może uniemożliwić nam za pomocą modyfikowalna lista gdzie wymagany jest umodifiable jeden, ale nie odwrotnie. (To pasuje do twoich wymagań ...) Ponadto klasa implementująca UnmodifiableList
nadal dziedziczy operację add
i nic nie powstrzyma aplikacji przed próbą jej wywołania.
Podsumowując, systemy typu statycznego nie mogą odpowiednio radzić sobie z tego rodzaju ograniczeniem.
Zastanawiam się, czy był jakiś powód, dla którego zrobili to w ten sposób. :( –
Jako ogólną zasadę należy kodować do interfejsów zamiast rzeczywistych klas uruchomieniowych 'Collections.unmodifiableList' przeznaczony jest w rzeczywistości, aby _force_ Ci kod do interfejsu –
@LouisWasserman -.. I nie sądzę, że to istotne na pytania uzupełniające PO, czyli te, na które odpowiadam –