2013-08-22 1 views
5

У меня есть пользовательский объект, который имеет одно значение типа int, которое я хочу обработать, чтобы сохранить это значение в заданном диапазоне. Мой вопрос таков: учитывая следующий класс, могу ли я установить его значение с помощью myObject = 0;Установить значение объекта специального класса с помощью оператора '=' в Java

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

Вместо того чтобы создать публичный метод недействительным setBar()

+3

Нет, вы не можете. –

ответ

4

Нет, вы не можете сделать это. Java не поддерживает перегрузку оператора. Хотя оператор + перегружен для выполнения конкатенации строк, но это единственное исключение. Другой пример, который использует оператор = так, как вам хотелось бы, это в случае классов-оболочек, где вы можете напрямую присваивать значения примитивного типа соответствующему типу-оболочке, что приводит к тому, что примитивное значение будет автоматически помещаться в оболочку.

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

Но он ограничен только для этой цели. Вы не можете сделать это для своего собственного пользовательского типа.

Создание метода является вашим единственным вариантом.

5

Если вы имеете в виду:

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

то нет, вы не можете сделать это в Java. Хорошо, если вы спросите меня ... это было бы ужасно с точки зрения удобочитаемости.

Вы также не может изменить его, чтобы:

foo x = 10; 

как эквивалент:

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

Я думаю, было бы неплохо работать с матрицами ... но, очевидно, не для этого примера. – sdasdadas

+0

Модификатор доступа в баре не является общедоступным, поэтому его нужно также изменить, если вы хотите установить x.bar –

+0

@ShivaKumar: Я предполагал, что это будет так. Хотя код можно было вызывать из того же класса, конечно :) –

0

Нет, это идет вразрез с инкапсуляцией логики и Java сама.

1

Foo myObject = new Foo();

Здесь myObject держит ссылку. Вы не можете присвоить примитивные значения, такие как 0, для ссылок на объекты.

Вместо этого, вы должны сделать myObject.setBar(10);

0

В Java, соглашение заключается в обеспечении сеттеров и добытчиками, чтобы изменить внутренние атрибуты объекта. В вашем случае:

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

сеттер получает новое значение и устанавливает его:

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

И геттер дает доступ к текущему значению поля:

public int getBar() { 
    return bar; 
} 

Вы не можете, однако , перегрузите оператора =, чтобы сделать как setBar, по крайней мере, на Java. Если вы одумаете, например, классы-оболочки или Float, там есть еще одна сила, связанная с самой реализацией Java, и которая позже выводится в понятиях бокс и unboxing.

+1

Вы хотите сказать 'foo.setBar (10)' или 'instance.setBar (10)'? –

+0

@VikasV Хорошо пятнистый. Исправлено, спасибо. – Gamb

+1

В качестве примечания к примечанию: соблюдайте соглашение об именовании Java. Классы должны начинаться с буквы верхнего уровня. – Gamb

0

Возможно, вы можете сделать это поле общедоступным. Вам просто нужно будет выполнить валидации, необходимые в бизнес-методе (нет во время набора).

+0

Это то, что я рассмотрел, но тогда мой вопрос заключается в том, что внутри конструктора я могу помещать какой-то слушатель в тогдашнее общедоступное поле, чтобы я мог выполнить некоторую обработку, как только ее изменили без необходимости вручную вызвать что-то вроде. process()? – Xandor

Смежные вопросы