2015-06-13 10 views

Odpowiedz

2

Sposób 2 jest lepszy, ponieważ zapewnia jednolity sposób ustawiania wartości zmiennej. Ale wiąże się to z ryzykiem, ponieważ wywołujesz metodę nadpisującą w konstruktorze. Więc prawo składni używa ostatecznego słowa kluczowego:

public final void setField(int field){ 
    this.field = field; 
} 

//way 2 
public A(int field){ 
    setField(field); 
} 

Z final metoda nie zostaną nadpisane. Jeśli nie możesz sobie pozwolić na ostateczną metodę, nie wywołuj regulatora w konstruktorze. Ale zwykle dziwne jest przesłonięcie setera.

To jest dobre, bo może chcesz zmienić setter później:

  • kontrole dodawania argument i rzucić IllegalArgumentException razie potrzeby.
  • Dodaj licznik
  • Informuj obserwatorów (w obserwowalnych wzorzec)
  • sprawiają, że blok synchronizowany zapewnić wątku bezpieczeństwa
  • ...

i trzeba będzie to zrobić w jedno miejsce. Jest to realizacja DRY principle.

public final synchronized void setField(int field){ 
    if (0 <= field && field <= MAX_VALUE) { 
     this.field = field; 
    } else { 
     throw new IllegalArgumentException(); 
    } 
} 

//still has all the benefits of setter 
public A(int field){ 
    setField(field); 
} 

A = new A(-1) //throws IllegalArgumentException 

Nie martw się o optymalizacji i kosztach metody dodatkowego wezwania. JVM zazwyczaj może zoptymalizować taki kod poprzez inlinowanie metod.

To, co tak naprawdę sprawia, że ​​rozwój jest wolniejszy, to szukanie błędu. Ta metoda pomaga zmniejszyć liczbę błędów i łatwiej utrzymać kod.

+0

Ale czy inwokacja nie jest metodą wolniejszą? – Aero

+0

Mam to. Dziękuję Ci. – Aero

+2

Może występować zagrożenie bezpieczeństwa wywoływania publicznej metody zastępowania wewnątrz konstruktora – dkatzel

0

Cóż, dla mnie sposób jest Więcej Java. mam na myśli to, że powinniśmy wiedzieć, co powinien zrobić konstruktor (aby ustawić właściwości instancji w czasie inicjalizacji) i co powinien zrobić seter (podać publiczny punkt otwarty, aby zmienić właściwości instancji w wybranym momencie).

nie należy umieszczać żadnych logikę w konstruktorze

tylko moja opition.

4

Podejrzewam, że nie ma "lepszej" drogi, po prostu chcę pasować do twojego celu w tym czasie.

Wolę Way # 1 przez większość czasu. Jest tak, ponieważ próbuję utworzyć kod jako Encapsulated, jak to możliwe. Można go również w pewnym sensie uznać za sposób programowania Java, ponieważ redukuje on efekty uboczne. Czasami eliminuje je wszystkie razem.

class A{ 
// common code 
private int field; 
public void setField(int field){ 
    this.field = field; 
} 

//way 1 
public A(int field){ 
    this.field = field; 
} 
} 

może być zapisane jako ...

class A{ 
// common code 
private final int field; 

//way 1 
public A(int field){ 
    this.field = field; 
} 

Tak, to nie będzie działać, jeśli trzeba zmienić wartość dziedzinie po konkretyzacji. Może być także inny obiekt lub kolekcja.

Ale w wysiłku uczynienia klasę jako niezmiennej, jak to możliwe, pola, które mogą być oznaczone jako prywatnej końcowego są zrobione.

Oczywiście nie można tego zrobić za pomocą metody ustawiającej.

+0

upvote dla ostatecznego hermetyzacji –

Powiązane problemy