2013-03-28 24 views
8

Podczas mojego stażu jeden z moich kolegów dał mi wskazówkę. Chcę wiedzieć, czy to dobra praktyka.ciąg prywatny lub publiczny ciąg statyczny?

To, co robiłem, to tworzenie klas, które są używane tylko dla wartości, które zawierają i nie mają żadnych funkcji, które faktycznie coś robią (oprócz posiadania modułów pobierających, ustawiających i konstruktora). Zadeklarowałem zmienne w następujący sposób:

public class ObjectIUse{ 
    Private String name; 

    public ObjectIUse(String name){ 
    this.name = name; 
    } 

    public String getName(){ 
    return name; 
    } 
} 

Nie używam setera, ponieważ zawsze powinien pozostać taki sam. Mój kolega powiedział, że mogę również zrobić to w ten sposób:

public class ObjectIUse{ 
    public final String name; 

    public ObjectIUse(String name){ 
    this.name = name; 
    } 
} 

Bo teraz nie musimy mieć żadnych pobierające i ustawiające bo to jest publiczna, ale może też nie być zmienione, ponieważ jest ostateczna.

Który byłby lepszy? A może lepiej byłoby uczynić to prywatnym, ale także ostatecznym? Mam na myśli, że wszystkie opcje działają, oczywiście. Chcę tylko wiedzieć, co jest lepsze i dlaczego.

+2

Ustaw jako prywatny. Spraw, aby był ostateczny. –

+1

Co powiedział Sayem. Publiczne zmienne członkowskie są "uważane za szkodliwe". Kiedy twój obiekt się nie zmienia (mówimy, że jest "niezmienny"), zadeklaruj zmienną składową "final". Zmusza to do ustawienia go w konstruktorze i uniemożliwia jego zmianę - nawet jeśli ktoś odzwierciedla instancję klasy. –

+0

To też było moim zdaniem lepszym rozwiązaniem. Jakie jest twoje rozumowanie? – WereWolfBoy

Odpowiedz

7

Ustaw zmienną jako prywatną, ponieważ dzięki temu będziesz encapsulating zmienną w swojej klasie. Ma to wiele zalet, information hiding jest jednym z nich, dowiesz się, jeśli przejdziesz do powyższego linku.

Jeśli chcesz, aby nigdy się nie zmieniło po stworzeniu, a następnie nadaj mu ostateczny kształt.

+0

Dowiedziałem się już o enkapsulacji.Pomyślałem, że to dziwne, że próbowali mnie nauczyć, żeby upublicznić to na moim stażu. Nadal będę to robił dla ich produktu, ponieważ robią to sami. Jednak nigdy bym tego nie zrobił dla moich własnych projektów. – WereWolfBoy

+0

@WereWolfBoy: Tak, w kodzie jakości produkcji należy zawsze próbować korzystać z prywatnych danych. I tak, to było dziwne, że próbowali cię uczyć, kiedy robiłeś internację (chodzi mi o to, że musisz nauczyć się pisać kod jakości produkcji podczas stażu, prawda?). Można jednak upublicznić go na przykład w swoich testach/zabawach/domowych projektach, ale kod jakości produkcji nigdy nie jest w porządku. Być może powinieneś zapytać ich o to ...... –

+2

Powiedziałbym, że ta osoba jest hackerem, a nie programistą i prawdopodobnie nie rozumie wszystkich konsekwencji jego decyzji. I widząc jego radę, byłbym zmęczony tym, co mi powiedział w przyszłości. Pamiętaj jednak, że jako stażysta będą traktować cię tak, jakbyś nie wiedział, o czym mówisz, więc nie próbuj się kłócić. – CodeChimp

1

Który byłby lepszy? A może lepiej by było, gdyby było ono prywatne, ale również ostateczne?

Jeśli chcesz odnieść sukces jako programista, powinieneś programować poprawnie, sprawnie i co najważniejsze bezpiecznie. Bezpieczeństwo i wydajność są na pierwszym miejscu.

Gdy upublicznisz, złamiesz enkapsulacji, co jest bardzo ważne i ma wiele zalet. Za każdym razem, gdy chcesz uzyskać własność obiektu, gettery staną się twoim przyjacielem.

Generalnie nie powinieneś mieć bezpośredniego dostępu do właściwości obiektu (tylko w ekstremalnych przypadkach, ale również te można rozwiązać w lepszy sposób). Gettery i setery są przeznaczone do tych celów - zachowują hermetyzację i bezpiecznie obchodzą się z obiektami.

final variables są zwykle używane do danych, które są niezmienne w czasie.

1

Pomysł polegający na tym, że nie udostępnia się metody ustawiającej dla zmiennej, powoduje, że jest to pole tylko do odczytu, co oznacza, że ​​możemy tylko czytać, ale nie pisać, co czyni go stałym przez użycie słowa kluczowego final. wszystko.

Myślę, że stała jest lepsza. final słowo kluczowe poprawia wydajność. Przeczytaj więcej here

1

Powinieneś mieć zdobywcę i uczynić swoje pole prywatnym. To właśnie nazywamy enkapsulacją.

Również przez uczynienie go końcowym, a więc nie mając settera, twój obiekt jest niezmienny, co jest bardzo dobre dla programowania równoległego.

1

Właściwym zastosowaniem zasady enkapsulacji jest uczynienie wszystkich pól klasy prywatnymi i dostęp do nich za pomocą ustawiaczy i pobierających. Poza tym możesz dodać dodatkową logikę, gdy dzwonisz pod numer getName(). Podczas gdy drugi wariant jest czasami używany, pierwszy jest lepszy. Mam nadzieję że to pomoże.

4

Działa to teraz, ponieważ String jest niezmienny. Ale co się stanie, gdy odsłonisz odniesienie do zmiennej klasy i ta klasa nie będzie bezpieczna dla wątków? Nie możesz nawet zwrócić wartości defensive copy, jeśli chcesz.

Nie wspominając już o tym, łamie również hermetyzację. Użyj zmiennej prywatnej i getters.

1

Myślę, że ich rozumowanie polega na tym, że posiadanie go public utrzymuje kod prostszy. Java jest krytykowana za zbytnią gadatliwość w takich sytuacjach. W języku takim jak Javascript, gdzie zwykle (zwykle) jest public.

Ale ta prostota jest kompromisem w kwestii posiadania bezpiecznego, stabilnego i rozszerzalnego kodu.

Aby zobaczyć, dlaczego jest to ważne, spójrz na projekt JavaScript w dużej skali, który został napisany ze wszystkim jako publiczny. Kod każdej klasy może być prosty ... ale ich relacje i wynikająca z tego architektura stają się koszmarem do utrzymania.

+0

To prawda, że ​​wiele rzeczy, które robią, jest związanych z witryną ... zawierających mnóstwo kodu javascript. Więc to prawdopodobnie dlatego, że używają go również w java/android. – WereWolfBoy

0

Myślę, że to zależy. Na przykład: jeśli używasz gettera - możesz go przesłonić. Czasami jest to bardzo przydatne.