Как сломать / выйти из разных уровней вызова метода в Java - PullRequest
2 голосов
/ 02 апреля 2011

Допустим, у меня есть:

public void one() {
  two();
  // continue here
}
public void two() {
  three();
}
public void three() {
  // exits two() and three() and continues back in one()
}

Есть ли способы сделать это?

Ответы [ 3 ]

5 голосов
/ 02 апреля 2011

Единственный способ сделать это без метода изменения два () - вызвать исключение.

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

Однако самое простое решение - встроить методы в один более крупный метод. Если он слишком велик, вы должны изменить его структуру другим способом, а не размещать сложные элементы управления между такими методами, как этот.


Скажем, у вас есть

public void one() {
    System.out.println("Start of one.");
    two();
// do something
    System.out.println("End of one.");
}

public void two() {
    System.out.println("Start of two.");
    three();
// do something
    System.out.println("End of two.");
}

public void three() {
    System.out.println("Start of three.");
// do something
    System.out.println("End of three.");
}

Вы можете добавить непроверенное исключение, если не можете изменить два ();

public void one() {
    System.out.println("Start of one.");
    try {
        two();
    } catch (CancellationException expected) {
    }
// do something
    System.out.println("End of one.");
}

public void two() {
    System.out.println("Start of two.");
    three();
// do something
    System.out.println("End of two.");
}

public void three() {
    System.out.println("Start of three.");
// do something
    System.out.println("End of three.");
    throw new CancellationException(); // use your own exception if possible.
}

Вы можете вернуть логическое значение, чтобы сказать return, если вы можете изменить два ()

public void one() {
    System.out.println("Start of one.");
    two();
// do something
    System.out.println("End of one.");
}

public void two() {
    System.out.println("Start of two.");
    if (three()) return;
// do something
    System.out.println("End of two.");
}

public boolean three() {
    System.out.println("Start of three.");
// do something
    System.out.println("End of three.");
    return true;
}

Или вы можете встроить структуры

public void one() {
    System.out.println("Start of one.");
    two();
// do something
    System.out.println("End of one.");
}

public void two() {
    System.out.println("Start of two.");
    System.out.println("Start of three.");
// do something for three
    System.out.println("End of three.");
    boolean condition = true;
    if (!condition) {
// do something for two
        System.out.println("End of two.");
    }
}
1 голос
/ 02 апреля 2011

Если вы можете изменить метод two(), возможно, вы хотите что-то вроде этого?

public void one() {
    two();
    // continue here from condition
}

public void two() {
    if (three()) {
        // go back due to condition 
        return;
    }

    // condition wasn't met
}

public boolean three() {
    // some condition is determined here

    if (condition) {
        // exits two() and three() and continues back in one()
        return true;
    }

    // condition wasn't met, keep processing here

    // finally return false so two() keeps going too
    return false;
}
1 голос
/ 02 апреля 2011

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

...