hermetyzacja a klasy wewnętrzne

0

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?

0

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).

0

Ja z kolei z zasady nie lubie setterow i getterow, a w klasach wew. odnosze sie do pol.

0

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.

0

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:)

  1. Przykład konstruktora
 
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;
 }

}
  1. Przykład inkrementacji
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++;
 }

}
  1. Przykład kolekcji
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);
 }

}
  1. Ostatni przykład - nie do końca na temat wątku, ale bliski:
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!

0

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.

0
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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1