Mutable boolean field в Java
Мне нужно переменное логическое поле в Java (я верну это поле через метод get * позже, и это должно быть возможно изменить это поле).
Boolean не работает, потому что в булевом классе нет установленных * методов (я бы сказал, что логическое значение неизменное, вы можете изменить ссылку только, но вы не можете изменить сам объект).
Я предполагаю, что могу использовать Boolean массив размера 1. Но, вероятно, есть более элегантные решения?
Почему Java не имеет такой простой вещи?
Ответы
Ответ 1
Неизменяемые классы легче работать. Они никогда не изменятся и проблем с параллельным кодом не возникнет. (В принципе, есть меньше возможностей их разбить.)
Если вы хотите вернуть ссылку на ваше логическое значение, вы можете использовать java.util.concurrent.atomic.AtomicBoolean
, если вы работаете с несколькими потоками или обычным старым org.apache.commons.lang.mutable.MutableBoolean
.
Ответ 2
Возможно, напишите себе класс-оболочку
class BooleanHolder {
public boolean value;
}
Или создайте общий класс держателей (это означает, что вам придется использовать класс Boolean
вместо примитива Boolean
):
class Holder<T> {
public T value;
}
Затем вы возвращаете класс-оболочку вместо самого значения, что позволяет изменять значение внутри обертки.
Ответ 3
Если вы используете Java 5 или выше, используйте AtomicBoolean
Ответ 4
Почему бы не использовать булевский примитив?
например.
private boolean myFlag = false;
public void setMyFlag(boolean flag) {
myFlag = flag;
}
Обратите внимание, что ваш метод getter может возвращать Boolean, если требуется, из-за магии autoboxing. Это позволяет легко взаимозаменяемость между использованием примитивов и их эквивалентами объектов (например, boolean vs. Boolean или int vs. Integer).
Итак, чтобы обратиться к вашим отредактированным ответам re. доступные методы,
public Object getAttribute(String attributeName)
может быть реализовано путем возврата autoboxed boolean,.
Ответ 5
Как насчет только использования логического примитива?
private boolean value;
public void setValue(boolean value) {
this.value = value;
}
public boolean getValue() {
return value;
}
Ответ 6
Вы можете использовать логический массив
final boolean[] values = { false };
values[0] = true;
Ответ 7
Ответ, который мне больше всего понравился, был от Адама, чтобы написать собственный класс-оболочку... OK
/* Boolean to be passed as reference parameter */
public class Bool {
private boolean value;
public Bool() {
this.value = false;
}
public boolean is() {
return this.value;
}
public void setTrue() {
this.value = true;
}
public void setFalse() {
this.value = false;
}
}
Ответ 8
Если вы используете Android, вы можете использовать объекты android.util.Mutable *, которые обертывают различные примитивные значения. Например, цитирование из источника SDK:
public final class MutableBoolean {
public boolean value;
public MutableBoolean(boolean value) {
this.value = value;
}
}
Ответ 9
Вы действительно говорите, что хотите, чтобы вызывающие абоненты могли изменять логическое значение объекта, манипулируя тем, что возвращается? Чтобы объект и вызывающий пользователь могли поделиться ссылкой на него?
Именно поэтому я понимаю, учитывая:
class OddClass {
private Boolean strangeFlag;
public Object getAttrbiute(String attributeName) {
if (attributeName.equals("strangeflag")) return (Object)strangeFlag;
...
}
}
А затем вызывающий абонент:
Boolean manipulableFlag = (Boolean) myOddClass.getAttrbiute ("strangeflag");
И затем, если вызывающий абонент изменит значение manipulableFlag
, вы хотите, чтобы это изменение произошло в экземпляре OddClass, как если бы вызывающий вместо этого использовал метод setAttrbiute.
Это то, о чем вы спрашиваете?
В этом случае вам понадобится класс держателя, как было предложено Адамом.