2013-08-22 9 views
5

Mam niestandardowy obiekt, który ma pojedynczą wartość typu int, którą chcę przetworzyć, aby zachować tę wartość w ustawionym zakresie. Moje pytanie jest następujące: Biorąc pod uwagę następujące klasy, mogę ustawić jego wartość z myObject = 0;Ustawianie wartości obiektu klasy niestandardowej za pomocą operatora "=" w języku Java

public class foo{ 
    private int bar; 
    public foo(){ 
    } 
} 

Zamiast tworzyć metoda public void setBar()

+3

Nie, nie możesz. –

Odpowiedz

4

Nie, nie mogę tego zrobić. Java nie obsługuje przeciążania operatora. Chociaż operator + jest przeciążony do wykonywania konkatenacji String, ale jest to jedyny wyjątek. Inny przykład użycia operatora = w pożądany sposób dotyczy klas opakowania, w których można bezpośrednio przypisać wartości typu pierwotnego do odpowiedniego typu opakowania, co powoduje, że prymitywna wartość jest automatycznie pakowana do typu opakowania.

Integer val = 10; // 10 is auto-boxed to Integer reference 

Jest to jednak ograniczone do tego celu. Nie można tego zrobić dla własnego typu zdefiniowanego przez użytkownika.

Tworzenie metody jest jedyną opcją.

5

Jeśli masz na myśli:

foo x = new foo(); 
x = 10; // This is meant to set x.bar 

wtedy nie, nie można tego zrobić w Javie. Dobrze też, jeśli mnie zapytasz ... byłoby to okropne pod względem czytelności.

Ty również nie można go zmienić, aby umożliwić:

foo x = 10; 

za równoważne:

foo x = new foo(); 
x.bar = 10; // Or x.setBar(10); 
+0

Myślę, że byłoby miło pracować z matrycami ... ale oczywiście nie dla tego przykładu. – sdasdadas

+0

Modyfikator dostępu do paska nie jest publiczny, więc należy go również zmienić, jeśli chcesz ustawić x.bar –

+0

@ShivaKumar: Zakładam, że tak będzie. Chociaż kod mógł zostać wywołany z tej samej klasy, oczywiście :) –

0

Nie jest to sprzeczne z logiką hermetyzacji i Java sama.

1

Foo myObject = new Foo();

Tutaj myObject posiada odniesienie. Nie można przypisać wartości pierwotnej, takiej jak 0, do odwołań do obiektów.

Zamiast tego należy zrobić myObject.setBar(10);

0

W Javie, konwencja jest zapewnienie ustawiające i pobierające zmienić wewnętrzne atrybuty obiektu. W Twoim przypadku:

foo instance = new foo(); 
instance.setBar(10); //Sets bar to 10 
instance.getBar(); //returns bar's current value (right now 10) 

Setter otrzymuje nową wartość i ustawia go:

public void setBar(int newBar) { 
    bar = newBar; 
} 

A getter daje dostęp do bieżącej wartości danego pola:

public int getBar() { 
    return bar; 
} 

nie można jednak , przeciąż operator =, aby wykonać to co setBar, przynajmniej w Javie. Jeśli zastanawiasz się, na przykład klasy opakowujące Integer lub Float, jest tam jeszcze jedna siła związana z samą implementacją Java, która później wywodzi się z koncepcji boksowania i rozpakowywania.

+1

Chcesz powiedzieć 'foo.setBar (10)' lub 'instance.setBar (10)'? –

+0

@VikasV Dobrze zauważył. Naprawiono, dzięki. – Gamb

+1

Uwaga: należy przestrzegać konwencji nazewnictwa Java. Klasy powinny rozpoczynać się od wielkiej litery. – Gamb

0

Inna możliwość, możesz ustawić to pole jako publiczne. Wystarczy wykonać sprawdzanie poprawności w metodzie biznesowej (nie podczas zestawu).

+0

To jest coś, co brałem pod uwagę, ale moje pytanie brzmi: wewnątrz konstruktora mogę umieścić słuchacza na tym publicznym polu, tak, że mogę wykonać pewne przetwarzanie, gdy tylko zostanie zmieniony bez konieczności ręcznego wywoływania jakiegoś rodzaju. Metoda process()? – Xandor

Powiązane problemy