Z tymi getterami/setterami, to sam wiesz... niby wszędzie czytałem, że zmienne publiczne to "zuo" i ogólnie herezja.
Zasady są dobre, jeśli się je rozumie. A żeby zrozumieć zasady trzeba często je złamać (w zasadzie nawet nie złamać - przecież te wszystkie zasady i tak powstały w ten sposób, że ludzie pisali bez zasad, zobaczyli, że to kiepskie, więc wymyślili sobie zasady, żeby uniknąć błędów w przeszłości).
Zmienne publiczne są o tyle złe, że przez to inne obiekty mogą wpływać na szczegóły innego obiektu. Np. załóżmy, że obiekt A ma zmienną image
. Ta zmienna (zakładając enkapsulację) nie powinna być ruszana przez inne obiekty. Zmienna image
to powinna być prywatna sprawa obiektu A (jeśli istnieje potrzeba, żeby zmienić obrazek to obiekt powinien sam o tym decydować, być odpowiedzialnym za własną zmienną)
I teraz - czemu obiekt B nie powinien zmieniać pola obiektu A? (czyli czemu zmienne publiczne to "zuo")? Ponieważ łatwo wtedy o burdel, przestajesz mieć kontrolę nad tym, który obiekt zmienia co. Obiekt A ma jakąś zmienną, a jak pozwolisz wszystkim innym obiektom zmieniać tę zmienną, to potem bardzo łatwo o bugi. Z tego samego względu zmienne globalne są "złe" (uogólniając: "shared mutable state is the root of all evil" jak to się czasami mówi).
Problem tylko w tym, że dając setter do pola image
public void setImage(BufferedImage image)
{
this.image = image;
}
robisz taki jakby "back door" i inne obiekty mogą ruszać zmienną image, która wcale nie jest prywatna, jeśli jakiś inny obiekt może sobie wywołać funkcję setImage i zmienić image. Co z tego, że zmienna jest formalnie prywatna jak i tak pozwalasz zmieniać stan obiektu każdej innej zmiennej? I każdy obiekt może odczytać bieżącą wartość zmiennej? Tym sposobem stan obiektu staje się współdzielony (bo to docelowo bardziej o stan obiektu chodzi, a nie o zmienne). Więc możesz mieć takie same bugi/problemy potem, jakbyś dał zmienną publiczną.
Więc: kierujesz się zasadą, której nie rozumiesz do końca - i nic nie zyskujesz, a jedynie tracisz o tyle, że twój kod staje się dłuższy.
Oczywiście, gettery i settery przydają się w wielu przypadkach i nie chcę demonizować tego wzorca, jednak każdy wzorzec należy stosować ze zrozumieniem. Gettery i settery mają pewne oczywiste zalety (tj. kontrola dostępu, możliwość odpalenia dodatkowych przeliczeń itp.), ale samo korzystanie z getterów/setterów wcale nic nie zapewnia, ani nie sprawia, że twój kod stanie się lepszy czy bardziej odporny na bugi...
Tak samo zmienne publiczne - niby zło i herezja, ale jak się wie co się robi, to można stosować zmienne publiczne w ten sposób, że nic złego się nie będzie dziać (główny problem jednak polega na tym, że trzeba rozumieć dlaczego coś może być złe, a to często łączy się z tym, że człowiek na własnej skórze się pewnych rzeczy uczy i dopiero potem wie, czego unikać i na co zwracać uwagę).
Tak samo np. ze wzorcem Singleton, też niby "zły", ale jednak czasem można go zastosować i nic się nie dzieje. Trzeba po prostu rozumieć dlaczego coś może być złe. (tutaj np. Wujek Bob fajnie broni wysmiewanego wzorca Singleton: https://8thlight.com/blog/uncle-bob/2015/06/30/the-little-singleton.html - przy czym esencją tego tekstu wcale nie jest to, że Singletony są "dobre", tylko, że zasady trzeba rozumieć, a nie przyjmować na dobrą wiarę).