Mam pytanie odnośnie poprawności kodu i konwencji programowania.
Jeśli w klasie wewnętrznej operuję na polach klasy głównej, to czy powinienem używać metod 'get' i 'set' dla tych pól?
Mam pytanie odnośnie poprawności kodu i konwencji programowania.
Jeśli w klasie wewnętrznej operuję na polach klasy głównej, to czy powinienem używać metod 'get' i 'set' dla tych pól?
To zależy, ale w sumie warto używać getterów i setterów. Jak nagle Ci się zachce wprowadzić jakąś kontrolę czy inne operacje przy ustawianiu, pobieraniu wartości to będzie mniej kodu do zmiany(wystarczy, że zmodyfikujesz dany getter/setter).
Ja z kolei z zasady nie lubie setterow i getterow, a w klasach wew. odnosze sie do pol.
Wypróbowałem oba podejścia i jednak pozostanę przy tworzeniu getterów i setterów dla klas zewnętrznych, ale z bezpośrednim odnoszeniem się do pól jeśli są mi one potrzebne w klasach wewnętrznych. I tak są one widoczne w klasie wewnętrznej, a dodatkowe metody tylko utrudniają czytanie kodu.
Cześć!
Disclaimer: dopiero zaczynam swoją przygodę z Java: nauczyłem się podstaw, wzorców projektowych - proszę o wyrozumiałość:)
Chciałbym się odwołać do tego wątku i ponownie poprosić o opinię, czy jest dobrą praktyką stosowanie tzw. getterów i setterów wewnątrz klas (dla stricte wewnątrznych potrzeb klas). Nie mogę znaleźć jednoznacznej odpowiedzi, między innymi na stackoverflow.. Czy ktoś by chciał wyrazić zdanie na ten temat?
Poniżej podam kilka konkretnych przykładów. Proszę o porównanie - czy podejścia z wykorzystaniem tzw. getterów i setterów są lepsze/gorsze? Oczywiście, załóżmy, że te przykłady mają jakiś cel:)
public class A {
private B b;
public (B b) {
this.setB(b);
}
private void setB(B b) {
this.b = b;
}
}
ALBO
public class A {
private B b;
public (B b) {
this.b = b;
}
}
public class A {
private int b;
private int getB() {
return this.b;
}
private void setB(int b) {
this.b = b;
}
private void incrementB() {
this.setB(this.getB()+1);
}
}
ALBO
public class A {
private int b;
private void incrementB() {
this.b++;
}
}
import java.util.ArrayList;
public class A {
private ArrayList<String> listOfB = new ArrayList<String>();
public void addB(String b) {
this.getListOfB().add(b);
}
private ArrayList<String> getListOfB() {
return this.listOfB;
}
}
ALBO
import java.util.ArrayList;
public class A {
private ArrayList<String> listOfB = new ArrayList<String>();
public void addB(String b) {
this.listOfB.add(b);
}
}
public class A {
private B b;
public A() {
this.instantiateB();
}
private instantiateB() {
this.b = new B();
}
}
ALBO
public class A {
private B b;
public A() {
this.b = new B();
}
}
Z góry dziękuję za odpowiedzi!
Moim zdaniem sama idea prywatnych getterów/setterów raczej średnio ma sens. Ma sens za to wydzielanie metod prywatnych żeby rozdzielić poziomy abstrakcji.
Np te kody jest mega bez sensu. Po co wydzielać coś tak prostego do funkcji; ukrywają tylko niepotrzebnie cel do którego ktoś je stworzył.
private void setB(B b) {
this.b = b;
}
private void incrementB() {
this.setB(this.getB()+1);
}
private instantiateB() {
this.b = new B();
}
Ten kod ma rację bytu, np gdyby był tam jakieś magiczne numery, albo jakaś logika która się sama nie opisuje.
private void incrementB() {
this.b++;
}
Wtedy wsadza się taki niejasny kod do metody, z opisową nazwą.
Np w / h*h
, mimo że jest proste jest nieczytelne; ale już wydzielone do metody calculateBmi
staje się jasne jak słońce.
Sandor napisał(a):
Chciałbym się odwołać do tego wątku i ponownie poprosić o opinię, czy jest dobrą praktyką stosowanie tzw. getterów i setterów wewnątrz klas (dla stricte wewnątrznych potrzeb klas).
Tzw. gettery i settery służą do ustalania praw zapisu/aktualizacji (set) i/lub odczytu (get) wartości prywatnych pól danej klasy przez INNE klasy/obiekty. Stosowanie ich wewnątrz klasy (private getMyFieldValue) jest kompletnie bez sensu - nic w ten sposób nie hermetyzujesz, bo do prywatnego pola i tak się możesz dostać z każdego miejsca klasy (nie potrzebujesz do tego dodatkowej metody get/set).