Czym są zmienne/niezmienne obiekty i dlaczego są - 1

Witaj Amigo!

Witaj Bilaabo!

— Dzisiaj Bilaabo opowie ci o obiektach zmiennych i niezmiennych .

Obiekty, które można zmienić po utworzeniu, nazywane są mutable lub mutable .

Obiekty, których nie można zmienić po utworzeniu, nazywane są immutable lub immutable .

— Co decyduje o tym, czy obiekt można zmienić, czy nie?

- Osoba, która pisze nową klasę, może uczynić obiekty tej klasy niezmiennymi. Np. możesz ukryć wszystkie settery - obiekt będzie miał tylko konstruktor i gettery, co oznacza, że ​​po utworzeniu obiektu nie będzie już możliwości jego zmiany.

— A jaki z tego pożytek?

- Niezmienne obiekty mają wiele przydatnych właściwości. Ale są dwa, które są typowe dla prawie wszystkich niezmiennych obiektów:

1) Niezmienne obiekty można zaimplementować znacznie łatwiej niż zmienne.

2) Niezmienne obiekty mogą być swobodnie używane jednocześnie z różnych wątków.

Najczęściej, gdy programista decyduje się na napisanie klasy immutable, tworzy dwie wersje tej klasy – mutable i immutable.

- Jaki jest sens pisania dwóch klas zamiast jednej?

- Czasami bardziej opłaca się, gdy niezmienna wersja obiektu będzie znacznie prostsza/szybsza niż zmienna. Następnie tworzą dwie wersje. To prawie jak ArrayList i LinkedList: obie są listami, ale jedna jest zoptymalizowana do jednego celu, a druga do innych.

- Teraz jest jaśniej.

- Istnieją również klasy czysto niezmienne, bez ich zmiennej wersji.

— A jeśli trzeba coś zmienić w takim obiekcie? Co można zrobić z niezmiennym obiektem?

- Zwykle niezmienne klasy zawierają różne metody, które „niejako” zmieniają obiekt, ale zamiast zmieniać sam obiekt, metody te po prostu tworzą nowy obiekt i zwracają go.

Oto kilka przykładów dla Ciebie:

Kod Javy Opis
String s = "moscow";
String s2 = s.toUpperCase();
W rezultacie s zawiera ciąg „moskwa”, a s2 zawiera „MOSKWA”
Integer i = 1;
Integer j = i;
j++;
Oto, co faktycznie się dzieje:
liczba całkowita i = nowa liczba całkowita (1);
liczba całkowita j = i;
j = nowa liczba całkowita(i.getInt()+1);

Klasa String jest klasą niezmienną. Wszystkie obiekty typu String są niezmienne, co jednak nie przeszkadza nam w pracy z nimi. Na przykład metoda toUpperCase () klasy String konwertuje ciąg znaków na wielkie litery (zastępuje wszystkie małe litery dużymi literami). Ale ta metoda nie zmienia samego ciągu, ale zwraca nowy ciąg, który jest identyczny z pierwszym, tylko wszystkie znaki są wielkie (duże).

Klasa Integer jest również klasą niezmienną. Wszystkie obiekty typu Integer są niezmienne. Za każdym razem, gdy zmieniamy obiekt typu Integer, w rzeczywistości tworzony jest nowy obiekt.

- Jakie interesujące. Brawo, Bilaabo.

„Hurra dla mnie, hurra dla Bilaabo!”