Установите значение объекта пользовательского класса с помощью оператора '=' в Java

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

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

Вместо создания метода public void setBar()


person Xandor    schedule 22.08.2013    source источник


Ответы (6)


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

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);
person Jon Skeet    schedule 22.08.2013
comment
Я думаю, что это было бы неплохо для работы с матрицами... но явно не для этого примера. - person sdasdadas; 22.08.2013
comment
Модификатор доступа к бару не является общедоступным, поэтому его тоже нужно изменить, если вы хотите установить x.bar - person Shiva Kumar; 22.08.2013
comment
@ShivaKumar: я предполагал, что так и будет. Хотя код можно было бы вызывать из того же класса, конечно :) - person Jon Skeet; 22.08.2013
comment
Не могу не согласиться. На мой взгляд, удобочитаемость важнее, чем то, что в Java невозможно перегрузить операторы. Я бы не рекомендовал делать это, если бы это было возможно. - person Viktor Seifert; 22.08.2013
comment
Что касается удобочитаемости, я, по сути, пытаюсь создать собственный тип данных, который работает как int с ограничением диапазона. При использовании он будет читаться намного лучше, чем методы get/set (все мои рассуждения в этом желании). Мне нужно запустить некоторый код, когда значение установлено, чтобы убедиться, что оно находится в диапазоне, иначе выдать исключение (это кодирование я уже сделал). Так что да, он должен быть закрытым, если только (как указано ниже в другом комментарии) я не могу прослушать изменение общедоступного значения, чтобы для обработки мог автоматически вызываться частный метод. - person Xandor; 22.08.2013

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

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

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

Единственный вариант — создать метод.

person Rohit Jain    schedule 22.08.2013

Foo myObject = new Foo();

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

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

person Vikas V    schedule 22.08.2013

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

person Abstract    schedule 22.08.2013

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

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

В 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. Если вы думаете, например, о классах-оболочках Integer или Float, то там действует еще одна сила, связанная с самой реализацией Java и которая позже вытекает из концепций упаковки и распаковки< /эм>.

person Fritz    schedule 22.08.2013
comment
Вы хотите сказать foo.setBar(10) или instance.setBar(10)? - person Vikas V; 22.08.2013
comment
В качестве примечания: следуйте соглашению об именах Java. Занятия должны начинаться с заглавной буквы. - person Fritz; 22.08.2013