Mam klasę z prywatnym polem, które jest zmienną kolekcją. Pole w tym konkretnym przypadku to ArrayBuffer
, chociaż moje pytanie dotyczy dowolnego skończonego, uporządkowanego typu kolekcji o swobodnym dostępie. Chcę udostępnić to pole bez pozwolenia innym na jego modyfikację. W Javie Chciałbym dodać metodę jak:Niezmodyfikowany widok zmiennego zbioru Scala
private List<T> theList;
public List<T> getList() {
return Collections.unmodifiableList(theList);
}
w Javie po prostu przyjąć, że wynik jest List
że nie w pełni implementować interfejs List
ponieważ #add
i przyjaciele rzucają UnsupportedOperationException
.
W Scali, oczekiwałbym znalezienia odpowiedniej cechy z akcesorami takimi jak iterator
, size
i apply
(do pobierania wartości według indeksu), ale bez mutatorów. Czy istnieje taki typ, którego jeszcze nie znalazłem?
Czy coś metody '.toVector', co chcesz? Zwróci kopię wartości w 'ArrayBuffer' jako' Vector', który jest niezmienny i obsługuje szybki losowy dostęp. ('.toVector' jest tylko w Scali 2.10, dla 2.9.2 możesz zrobić coś takiego jak' Vector() ++ myArrayBuffer') – adelbertc
Rozmiar kolekcji może być w dziesiątkach tysięcy. Czy to wystarczająco duże, aby uzasadnić moją niechęć do kopiowania niezmiennych kolekcji? –
Twój przykład Java nie tworzy niezmiennej listy. Po prostu ukrywa zmienne listy w opakowaniu immutabl-owskim. Każdy obiekt zachowujący odniesienie do listy bazowej może ją zmutować ... Jeśli ci to wystarczy, możesz łatwo zastosować to samo podejście ... – paradigmatic