2014-11-03 3 views
1

Я просто хочу спросить, можно ли проверить, что метод void «отменен», вызвав return;?Могу ли я проверить, возвращен ли метод void?

Например, в моей основной я называю calculate(myArray);, которая определяется следующим образом:

public static void calculate(Object[] array) { 
    if (array == null) 
     return; 
    // do stuff 
} 

Является ли их способ узнать, если он вернулся или нет? Мои мысли делали «глобальное» логическое значение, которое было изменено на true до того, как мы вернемся, а затем проверим его значение в главном или просто изменим тип возвращаемого значения на что-то вроде int, и когда оно вернется в начале, мы используем return -1; и в конце метод return 0;

Возможно, но я думаю, что ни один из них не очень хороший. Есть ли альтернатива?

+3

заставить его возвращать логическое значение? –

+6

'throw new NullPointerException (" Array is null ");'? – TNT

+0

Почему это не «хороший стиль»? – Chiseled

ответ

2

Нет, вы не можете. От The Oracle Java tutorials - Returning a Value from a Method:

Любой объявленный метод void не возвращает значение. Он не должен содержать оператор return, но он может это сделать. В таком случае, return заявление может быть использовано для разветвляется блок потока управления и выхода из метода и просто используется как это:

return; 

Существует никоим образом от вызова методы не если определить Метод void был завершен провальным блоком или оператором return;.

Большинство других методов включает тип возврата boolean и возвращает false, когда что-то пошло не так, или просто выбрасывает IllegalArgumentException.

+0

Как то, что сказал Теодорос Чацигианнакис, но с более подробным объяснением с официального сайта. Спасибо за это разъяснение. – Frozn

5

Вы правы, что описанные вами практики считаются плохими на Java (и других современных языках).

Наиболее распространенные приемлемые методы для вашего сценария:

  • Сделать метод сгенерирует исключение. Сделайте это, если «нормальный» код не должен происходить при нормальных обстоятельствах.
  • Введите способ возврата метода bool, чтобы указать на успех или неудачу. Сделайте это, если «неудачный» путь кода может произойти и при нормальных обстоятельствах.
+0

Думаю, я использую способ остроумия ч исключений. Выглядит «лучше» для меня. И тебе спасибо. – Frozn

3

Вы можете использовать издатель - слушатель рисунок :)

import java.awt.event.ActionListener; 
import java.util.LinkedList; 
import java.util.List; 

public class Sample { 

    private interface Event { 

    } 

    private static class ExitEvent implements Event { 

    } 

    private static class SucceedEvent implements Event { 

    } 

    private interface EventListener { 
     void eventPerformed(Event e); 
    } 

    private static List<EventListener> listeners = new LinkedList<EventListener>(); 

    private static void addActionListener(EventListener l) { 
     listeners.add(l); 
    } 

    private static void fireEvent(Event event) { 
     for (EventListener l : listeners) { 
      l.eventPerformed(event); 
     } 
    } 

    public static void calculate(Object[] array) { 
     if (array == null) { 
      fireEvent(new ExitEvent()); 
      return; 
     } 

     fireEvent(new SucceedEvent()); 
    } 

    public static void main(String[] args) { 

     addActionListener(new EventListener() { 

      public void eventPerformed(Event e) { 

       if (e instanceof ExitEvent) { 
        System.out.println("Exit"); 
       } else if (e instanceof SucceedEvent) { 
        System.out.println("Success"); 
       } 

      } 

     }); 

     calculate(null); 
     calculate(new Object[] {}); 

    } 

} 

Выход:

Exit 
Success 

Вы можете пойти гораздо дальше и удалить эти уродливые сослагательного наклонения, используя паттерн посетитель

import java.util.LinkedList; 
import java.util.List; 

public class Sample { 

    private interface EventVisitor { 
     void visit(ExitEvent event); 

     void visit(SucceedEvent event); 
    } 

    private interface Event { 
     void accept(EventVisitor visitor); 
    } 

    private static class ExitEvent implements Event { 

     public void accept(EventVisitor visitor) { 
      visitor.visit(this); 
     } 

    } 

    private static class SucceedEvent implements Event { 

     public void accept(EventVisitor visitor) { 
      visitor.visit(this); 
     } 

    } 

    private interface EventListener { 
     void eventPerformed(Event e); 
    } 

    private static List<EventListener> listeners = new LinkedList<EventListener>(); 

    private static void addActionListener(EventListener l) { 
     listeners.add(l); 
    } 

    private static void fireEvent(Event event) { 
     for (EventListener l : listeners) { 
      l.eventPerformed(event); 
     } 
    } 

    public static void calculate(Object[] array) { 
     if (array == null) { 
      fireEvent(new ExitEvent()); 
      return; 
     } 

     fireEvent(new SucceedEvent()); 
    } 

    public static void main(String[] args) { 

     addActionListener(new EventListener() { 

      public void eventPerformed(Event e) { 

       e.accept(new EventVisitor() { 

        public void visit(SucceedEvent event) { 
         System.out.println("Success"); 

        } 

        public void visit(ExitEvent event) { 
         System.out.println("Exit"); 

        } 
       }); 

      } 

     }); 

     calculate(null); 
     calculate(new Object[] {}); 

    } 

} 

Выход:

Exit 
Success 
+0

Не тестировал, выглядит немного долго, но хорошо. Спасибо :) – Frozn

+0

Если возвращение на раннем этапе не является исключительным поведением, это каким-то образом (что-то, чего почти никогда не бывает), шаблоны в этом решении лучше практиковать, чем бросать исключение. – ssube

+0

Это отличная идея и хорошо подходит для этого случая - upvoted :) Хотя необходимо провести дополнительные проверки для обеспечения безопасности потоков, но демонстрация понятна и полезна. Отлично сработано! – Unihedron

Смежные вопросы