Uwielbiam niezmienny „wzorzec” ze względu na jego mocne strony, aw przeszłości uważałem za korzystne projektowanie systemów z niezmiennymi typami danych (niektóre, większość lub nawet wszystkie). Często kiedy to robię, piszę mniej błędów, a debugowanie jest znacznie łatwiejsze.
Jednak moi rówieśnicy w ogóle unikają niezmienności. Nie są wcale niedoświadczeni (z dala od tego), ale piszą obiekty danych w klasyczny sposób - prywatni członkowie z getterem i setersem dla każdego członka. Wtedy zwykle ich konstruktorzy nie przyjmują argumentów, a może po prostu biorą argumenty dla wygody. Tak często tworzenie obiektu wygląda następująco:
Foo a = new Foo();
a.setProperty1("asdf");
a.setProperty2("bcde");
Może robią to wszędzie. Może nawet nie definiują konstruktora, który bierze te dwa ciągi, bez względu na to, jak ważne są. I może nie zmieniają później wartości tych ciągów i nigdy nie muszą tego robić. Oczywiście, jeśli te rzeczy są prawdziwe, obiekt byłby lepiej zaprojektowany jako niezmienny, prawda? (konstruktor przyjmuje dwie właściwości, w ogóle nie ma seterów).
Jak decydujesz, czy typ obiektu powinien zostać zaprojektowany jako niezmienny? Czy istnieje dobry zestaw kryteriów do oceny?
Obecnie zastanawiam się, czy zmienić kilka typów danych w moim projekcie na niezmienne, ale musiałbym uzasadnić to moim rówieśnikom, a dane w tych typach mogą (BARDZO rzadko) ulec zmianie - w którym momencie możesz oczywiście zmienić to niezmienny sposób (utwórz nowy, kopiując właściwości ze starego obiektu, z wyjątkiem tych, które chcesz zmienić). Ale nie jestem pewien, czy to tylko moja miłość do przejawiania się niezmienności, czy też istnieje rzeczywista potrzeba / korzyść z nich.