2014-11-23 2 views
2

Я разрабатываю рамки кластеров и у меня есть следующий интерфейс для того, чтобы обеспечить возможность выполнения фрагмента кода на другой узел в кластере:Удобно ли использовать java.lang.Void для классов, которые ничего не возвращают?

interface Operation<V> { 
    V run(); 
    int getService(); 
} 

Однако пользователь может не заботиться о результат операции. В этом случае я должен предоставить удобный для них способ. У меня есть два варианта:

я могу сказать им, чтобы использовать java.lang.Void в качестве параметра и проверить тип возвращаемого значения в удаленном сервере и возвращает результат, если общий тип не Пустота:

new Operation<Void> { 
    public Void run() { 
     // 
     return null; 
    } 
    public int getService() { return 1; } 
} 

Однако , даже если они используют java.lang.Void, им все равно нужно что-то вернуть в методе запуска, поэтому это может быть не лучший способ сделать что-то подобное.

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

interface FireAndForgetOperation { 
    void run(); 
    int getService(); 
} 

Какой путь вы считаете более удобным?

+1

Я думаю, что это основано на мнениях, но два интерфейса примерно в два раза больше, чем один, и принуждение реализатора к явному возврату 'Void' действительно не кажется таким обременительным. –

+0

Если бы я был вами, я бы пошел с Java8 «Необязательный » тип –

+0

. Затем пользователям нужно вернуть Optional.empty(), right @kocko? – Boyolame

ответ

1

Я думаю, ваш первый подход удобен. Он используется внутри некоторых java-библиотек. Одним из примеров является интерфейс обратного вызова в JavaFX (https://docs.oracle.com/javafx/2/api/javafx/util/Callback.html). код, который необходимо использовать функцию обратного вызова и не хотите какой-либо возвращенное значение объявляет обратный вызов, как:

CallBack<SomeClass, Void> myCallBack; 

И в методе вызова вы возвращаете нуль;

1

Я бы определенно сделать что-то вроде этого, чтобы не подвергать то, что не должны быть:

public interface Operation<V> { 
    V run(); 
    public int getService(); 
} 

abstract public class VoidOperation implements Operation<Void> { 

    public final Void run() { 
     runVoid(); 
     return null; 
    } 

    abstract public void runVoid(); 

    abstract public int getService(); 
} 

Использование:

new Operation<String>() { 
     public String run() { 
      return null; 
     } 
     public int getService() { return 1; } 
    }; 

    new VoidOperation() { 
     public void runVoid() { 
     } 
     public int getService() { return 1; } 
    }; 
Смежные вопросы