2010-09-19 12 views
5

Chciałbym wiedzieć w jakich scenariuszach używasz enkapsulacji. Celem tego pytania jest współpraca przy współpracy. Więc podziel się swoim doświadczeniem, gdy temat jest hermetyzacją.W jakich scenariuszach używasz enkapsulacji?

Niektóre scenariusze:

Obliczone własności

public class Order { 

    private List<ListItem> listItems = new ArrayList<ListItem>(); 

    public double getTotal() { 
     double total = 0; 
     for(ListItem listItem: listItems) 
      total += listItem.getQuantity() * listItem.getPropduct().getPrice(); 

     return total; 
    } 

} 

domeny własnym walidacji obiektów

public class Person { 

    private String name; 

    public void setName(String name) { 
     if(StringUtils.isBlank(name)) { 
      throw new NotEmptyException("name", name); 
     } 

     this.name = name; 
    } 

} 

Sprawia stosowanie innego rodzaju zajęć dla jakiegoś szczególnego zachowania

public class Person { 

    private MutableInt id = new MutableInt(); 

    /** 
     * Integer itself is immutable 
     */ 
    public Integer getId() { 
     retur id.intValue(); 
    } 

} 

Konwersja

public class Person { 

    public String enabled; 

    public boolean isEnabled() { 
     return "Y".equals(enabled); 
    } 

} 
+1

Twoja metoda "isEnabled" może zostać skrócona do "return" Y ".equals (enabled);'. – whiskeysierra

Odpowiedz

4

Wystarczy, wolę używać silnych enkapsulacji w wszystkich non-prywatnych API, które projektuję/wdrożenia.

Jedyny przypadek, w którym zwykle nie używać silnego hermetyzacji jest z prywatnych klas zagnieżdżonych, które są (i muszą być) niewiele ponad pseudomądrości struct deklaracji. Moje rozumowanie jest takie, że klasa prywatna jest wystarczająco zamknięta, ponieważ jest zagnieżdżona i prywatna.

Jestem również przygotowany na relaks enkapsulacji (nieco), jeśli istnieją ku temu powody. Ta relaksacja zwykle składa się z nieszczelnych wewnętrznych tablic/kolekcji, gdy koszt ich kopiowania jest wygórowany. I zawsze sprawia, że ​​czuję się nieswojo robiąc to ...

+1

+1. Enkapsulacja we WSZYSTKICH scenariuszach, chyba że naprawdę jest naprawdę wygórowana ... – Nivas

+0

+1 Nivas. re: struct. Uważam, że za każdym razem, gdy używam struct zamiast klasy, kończę na tym, że później zniszczę strukturę i zastąpię ją klasą. re: wydajność. problemy z wydajnością w moim kodzie wymagają dostępu do bazy danych w 99% przypadków. Nigdy nie miałem problemu z wydajnością spowodowanego przez zwykły kod Java. –

0

Zamykam, gdy istnieje scenariusz, w którym użytkownik może go zepsuć. np. gdybym pisał klasę, która wyświetlał tekst, nie hermetyzowałbym faktu, że trzymam ciąg, ponieważ dowolny ciąg jest ważny do wyświetlenia.

Istnieje enkapsulacja do sprawdzania poprawności i zmiany interfejsu. Jeśli masz parametr, który nie wymaga sprawdzania poprawności (a interfejs jest dobrze zdefiniowany), nie ma sensu go enkapsulować, szczególnie jeśli używasz języka, który nie ma wbudowanych żadnych narzędzi, takich jak Java (narzędzia będąc na przykład właściwościami C#).

Kapsułkowanie to narzędzie jak każde inne i nie powinno być rzucane wszędzie, tylko dlatego, że możesz.

Powiązane problemy