Instrukcje
Tworzenie tablic do odczytu pozwoliło by zwiększyć szybkość jak i bezpieczeństwo pisanych programów. Była by to zwykła tablica tworzona na podstawie już istniejącej bez możliwości modyfikacji jej stanu.
Tablice częściowe tworzone na tablicach do odczytu pomogły by zmniejszyć ryzyko popełnienia błędu dostępu do niewłaściwego obszaru tablicy oraz zmniejszyło by zużycie pamięci.
Przegląd
Podsumowanie:
Obecnie tablice są jedyną konstrukcją która nie pozwala limitowania dostępu na zapis. Przy tym poziom kontroli nad nimi(min sprawdzanie indeksów) pozwala uważać, że nie powinno stanowić to problemów.
Tablice częściowe to bardziej skomplikowana sprawa, gdyż wymaga aby tablica zawierała informacje o rodzicu. Lub wręcz usprawnienia działania GC.
Główne zalety / korzyści:
- (Read-only) Zwiększenie bezpieczeństwa kodu.
- (Read-only) Oszczędność pamięci.
- (Partial) Zwiększenie bezpieczeństwa kodu.
- (Partial) Możliwość zredukowania konieczności kopiowania tablic do minimum.
- (Partial) Szybkość wydzielenia kawałka tablicy w stosunku do kopiowania.
Najistotniejsze wady:
- Trzeba zaimplementować.
- Problem z wyegzekwowaniem braku praw zapisu ze strony JNI.
- (Partial) Konieczność poprawienia GC, bądź liczenia się z tym, że pamięć nie będzie zwalniana.
Inne rozwiązania:
- ArrayListy tylko do odczytu.
- Iteratory.
- Kopiowanie tablic.
- Każdy konstruktor może zwracać dwa 'obiekty' jeden normalny drugi tylko do odczytu.
Przykłady:
public void array() {
int[] array = new int[] { 1, 2, 3, 4 };
int[] readOnlyArray = array.getReadOnly();
readOnlyArray[0] = 2; // Exception
readOnlyArray = readOnlyArray.getReadOnly(1,2);
System.out.println(readOnlyArray.length); // will print 1
}
Detale rozwiązania:
(tablica).getReadOnly() : T[]
(tablica).getReadOnly(int from,int to) : T[]
(tablica).isReadOnly() : boolean;
Kompatybilność wsteczna:
Zapewniona.
Kompatybilność w przód:
Trudno powiedzieć.
a zapewnienie tego "read-only" i "partial" miałoby być na etapie kompilacji, czy w bajtkodzie? Jeśli w bajtkodzie - to poprzez transparentne dla programisty generowanie odpowiedniego kodu, czy też może przez wprowadzenie zupełnie nowego typu danych "read-only array" (i utracenie kompatybilności wstecz)? A czemu nie korzystać z read-only Arrays.asList()?
ReplyDeleteZapewnienie tego miało by miejsce w run-time-ie (bajtkod).
ReplyDeleteW prawdzie wprowadzenie nowego typu danych było by lepsze, jednak jak wszyscy zapewne wiemy jet to na chwilę obecna nie możliwe, tak więc oba 'typy' były by widziane jako zwykła tablica.