Как передать булево значение между классами? - PullRequest
1 голос
/ 14 октября 2011

Я полностью игнорирую то, что считаю простым синтаксисом Java.

Вот пример моего первого класса:

public ExampleClass {
    public boolean exampleBool = false;

    if(SomethingImportantHappensOnRuntime) {
        exampleBool = true;
    }
}  

А вот и второй класс:

public ExampleClass2 {
    if(exampleBool) {
        //do stuff
    }
}

Как передать exampleBool из ExampleClass в ExampleClass2 , чтобы, когда что-то важное происходило во время выполнения, для exampleBool было установлено значение true и выполнялось «if» внутри «ExampleClass2»?

Ответы [ 4 ]

6 голосов
/ 14 октября 2011

Самый простой способ сделать это будет:

public ExampleClass {
    public static boolean exampleBool = false;

    public static boolean returnExampleBool () {
        return exampleBool;
    }

    if(SomethingImportantHappensOnRuntime) {
        exampleBool = true;
    }
}

public ExampleClass2 {
    if(ExampleClass.ReturnExampleBool()) {
        //do stuff
    }
}
1 голос
/ 14 октября 2011

Из вопроса не ясно, хотите ли вы просто иметь возможность читать переменную-член из одного класса в другом или хотите, чтобы второй класс реагировал, когда флаг установлен в первом.

Если вам нужен только доступ к переменной-члену, сделайте переменную-член закрытой, в противном случае ее можно изменить любым способом, а затем предоставьте метод доступа для чтения ее значения:

public ExampleClass {
    private boolean exampleBool = false;

    public boolean getExampleBool() {
        return exampleBool;
    }

    void someMethodOrOther() {
        if(somethingImportantHappensOnRuntime()) {
            exampleBool = true;
        }
    }
}   

Если вы хотите, чтобы ExampleClass2 реагировал, когдаexampleBool меняется, тогда это сложнее.Существует шаблон проектирования, называемый шаблон наблюдателя , который представляет собой готовое решение для такого рода ситуаций.

Это включает в себя добавление интерфейса между двумя классами, который позволяет второму классу прослушивать первыйбез первого, обладающего конкретными знаниями о втором.

interface ExampleClassObserver {
    public void exampleClassChanged(ExampleClass exampleClass);
}

public final class ExampleClass {
    private final List<ExampleClassObserver> observers = new ArrayList<ExampleClassObserver>();
    private boolean exampleBool = false;

    public boolean getExampleBool() {
        return exampleBool;
    }

    public final void addObserver(ExampleClassObserver observer) {
        observers.add(observer);
    }

    public final void removeObserver(ExampleClassObserver observer) {
        observers.remove(observer);
    }

    void someMethodOrOther() {
        if(somethingImportantHappensOnRuntime()) {
            exampleBool = true;
            notifyObservers();
        }
    }

    private void notifyObservers() {
        for (ExampleClassObserver observer : observers) {
            observer.exampleClassChanged(this);
        }
    }

}

public final class ExampleClass2 implements ExampleClassObserver {
    public ExampleClass2(ExampleClass exampleClass) {
        // we need to start observing the class so we're notified when the change happens
        exampleClass.addObserver(this);
    }
    public void exampleClassChanged(ExampleClass exampleClass) {
        if (exampleClass.getExampleBool()) {
            // do something
        }
    }
}

Итак, что здесь происходит, так это то, что когда установлен логический флаг, все, что наблюдает, получает уведомление об изменении, когда ExampleClass2 уведомляется, он проверяет флаг и делаетчто ему нужно.

0 голосов
/ 02 марта 2015

Я хочу поблагодарить Raza за простой ответ и поделиться своим, это адаптация для Spinner с Listener (setOnItemSelectedListener). Это может быть полезно для проверки того, что что-то было сделано с помощью счетчика, перед сохранением, или если счетчик находится в правильном положении и т. Д .:

Сначала установите два базовых класса, Раза с радостью предоставит нам:

public static boolean myBoolean = false;
    public static boolean ClassForRetruningBoolean() {
        return myBoolean;
    }

Во-вторых, я должен установить слушателя счетчика:

spinner.setOnItemSelectedListener(
                new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        if (position == 0) {

                            myBoolean = false;

                        }

                        else if (position != 0) {

                            myBoolean = true;

                        }
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        //Semicolons and parenthesis make crying faces
                    }
                }
        );

В-третьих, вы должны сделать этот класс доступным для вашего другого класса. Я делаю это с AndroidAnnotations. Также я в файле Activity.

@Bean
    TheClassWhereTheBooleanIs getingTheClassForTheBoolean;

После этого он устанавливает onClickListener для Button и извлекает класс, в который было записано логическое значение:

    myButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                /*Validation for empty CNC text area*/
                else if (getingTheClassForTheBoolean.ClassForRetruningBoolean() == true /*you could also add another condition here && etc*/) {
                    Toast toast = Toast.makeText(getApplicationContext(), "Boolean is True therefore no saving", Toast.LENGTH_LONG);
                    toast.show();
                }

                /*Every validation has being pass now you can move on*/
                else {

//So if the validation pass you can do the intent, the boolean is false

                    Intent i = new Intent(getApplicationContext(), OtherActivity.class);
                    startActivity(i);
                }


                }
            });

Надеюсь, вы, ребята, найдете это полезным

0 голосов
/ 14 октября 2011

У меня будет экземпляр ExampleClass2 в ExampleClass. ExampleClass2 должен иметь метод наподобие setBoolean (boolean b), который обновляет поле в объекте. Когда происходит событие, вы можете вызвать этот метод установки в ExampleClass2.

...