Есть ли способ массового назначения логических переменных в Java?

Единственное, чего я хочу избежать при программировании на Java, — это излишние объявления логических переменных, подобные этому:

public static boolean mytruebool = true, myfalsebool = false, myothertruebool = true, myotherfalsebool = false;

Есть ли эффективный способ (возможно, с использованием массива) объявления и назначения переменных? Любая помощь приветствуется!


person T145    schedule 04.02.2014    source источник
comment
Это зависит от того, как вы их используете.   -  person SLaks    schedule 04.02.2014
comment
Если вы не хотите, чтобы все они были истинными или все были ложными, вероятно, непрактично устанавливать их каким-либо другим способом, кроме как по отдельности.   -  person turbo    schedule 04.02.2014


Ответы (3)


Если вам удобно работать с битами, вы можете хранить все свои логические значения как одно целое число. В этом случае вы можете сохранить свое начальное состояние (и другие различные состояния) всех «переменных» в виде одного целочисленного значения.

boolean firstVar = false;
boolean secondVar = true;
boolean thirdVar = true;

...может стать...

public class Test {

    public static final int INITIAL_STATE = 6;
    private static int myVar = INITIAL_STATE;



    public static boolean getVar(int index) {
        return (myVar & (1 << index)) != 0;
    }



    public static void setVar(int index, boolean value) {
        if (value) {
            myVar |= (1 << index);
        } else {
            myVar &= ~(1 << index);
        }
    }



    public static void printState() {
        System.out.println("Decimal: " + myVar + "  Binary: " + Integer.toBinaryString(myVar));
    }



    public static void main(String[] args) {
        System.out.println(getVar(0)); // false
        System.out.println(getVar(1)); // true
        System.out.println(getVar(2)); // true
        printState();

        setVar(0, true);
        System.out.println(getVar(0)); // now, true
        printState();
    }
}

Узнайте больше о манипулировании битами здесь: Учебное пособие по смещению битов в Java?

person martinez314    schedule 04.02.2014
comment
Очень круто! Как изменяются значения переменных? Что происходит, когда myVar редактируется? (константа INITIAL_STATE, вероятно, не нужна, поскольку ее значение равно значению myVar; простое обнародование myVar даст уровень внешнего редактирования)? - person T145; 04.02.2014
comment
@ T145 Правильно, INITIAL_STATE не нужен. Но если у вас есть различные состояния всех ваших булевых переменных, которые вы можете захотеть назначить в разное время, тогда будет полезно хранить их как константы. - person martinez314; 04.02.2014
comment
Как мне сделать так, чтобы все значения были истинными по умолчанию? - person T145; 04.02.2014
comment
@ T145 -1 или ~ 0 (это тильда) будет работать. Прочтите о побитовых операциях, чтобы узнать, почему это так. - person martinez314; 04.02.2014
comment
Вместо 6, @whiskeyspider? - person T145; 04.02.2014

Если это поля (static или другие), boolean будет иметь начальное значение false. В этот момент вы устанавливаете их в соответствии с потребностями вашей программы. Так что, по крайней мере, вам не нужно беспокоиться о половине ваших логических полей.

Если вы обнаружите, что у вас слишком много boolean полей, вы можете пересмотреть дизайн своей программы вместо предварительной инициализации ваших значений.

person Makoto    schedule 04.02.2014
comment
+1 за второй абзац, -1 за первый. Нет никакой выгоды в том, чтобы инициализировать скалярные поля значениями по умолчанию и писать код, предполагающий, что они будут инициализированы таким образом. Вы сохраняете шесть или семь байтов в исходном файле, вот и все. Но вы сбиваете с толку читателей, которые могут быть не совсем знакомы с правилами Java в отношении инициализации по умолчанию. - person ajb; 04.02.2014
comment
@ajb, если вы будете работать с Java, вы должны понимать, по крайней мере, основы Java, такие как значения полей по умолчанию, поэтому, IMO, я не возражаю, просто позволяя полям неинициализироваться, если только это не приоритет, чтобы всегда давать им начальное значение. Например, всегда ли вы пишете свои классы сущностей с начальным значением, отличным от значения Java по умолчанию для всех полей в нем? - person Luiggi Mendoza; 04.02.2014
comment
@LuiggiMendoza Я не уверен, что понял ваш последний вопрос. Но если код в моем классе зависит от того факта, что поле int начинается с 0, тогда я пишу явный инициализатор. Если код всегда будет выполнять какое-то другое задание, прежде чем он его прочитает, то я этого не делаю. Аналогично для логических значений, ссылок и т. д. - person ajb; 04.02.2014
comment
@ajb, например, у вас есть этот класс Person с атрибутами String firstName, String middleName, String lastName, Date birthDate и String email (просто упомянем о них, может быть много других), вы бы инициализировали все эти поля в своем коде во всех других классах сущностей в ваше приложение, даже зная, что некоторые классы могут иметь 30 и более полей? Серьезно? - person Luiggi Mendoza; 04.02.2014
comment
@ajb: Тот факт, что эти поля начинаются с этих начальных значений, гарантируется JVM, но я не согласен с тем, что добавление этого дополнительного бита информации может быть полезным, но только в том случае, если есть несколько полей. Я рассматриваю ссылки в другом свете (иногда активная инициализация коллекции лучше), но мне не следует слишком беспокоиться о том, что Oracle забудет соблюдать контракт с начальным значением. Хотя это было и раньше (с массивами). - person Makoto; 04.02.2014

Это должно работать; уже проверено;

      boolean mytruebool,myothertruebool;
      mytruebool = myothertruebool= true;

      boolean myfalsebool,myotherfalsebool;
      myfalsebool=myotherfalsebool=false;
person z atef    schedule 04.02.2014
comment
Это не будет работать на уровне области видимости класса, на что указывают модификаторы public static. Потребуется использовать метод init() или какие-либо другие средства для инициализации переменных. Часть объявления была бы в порядке. - person turbo; 04.02.2014
comment
Если это строго общедоступная статика, то вы правы. иначе @T145 все еще может назначать локально объявленные логические переменные таким образом полумассовым, лол. - person z atef; 04.02.2014
comment
Обычно я стараюсь этого не делать, потому что: а) это неэффективно для изменяемых объектов; б) большинство разработчиков Java считают, что это противоположно визуальной простоте; в) если вы делаете это достаточно часто, становится трудно отслеживать, что к чему. - person T145; 04.02.2014