Вы можете задать метод для переменной?

Вопрос задан: 1 год назад Последняя активность: 1 год назад
up 17 down

Можно ли сделать что-то подобное в Java

private ? /* (I dont know what Class to use) */ shortcutToMethod = redundantMethod(game.getGraphics());

Таким образом, вместо вызова redundantMethod(game.getGraphics().doThisMethod());

Я мог бы просто сделать shortCutToMethod.doThisMethod();

Это возможно?

4 ответа

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

Реклама

up 21 down

В Java, существуют различные способы. Если вы посмотрите на java.util.function пакет, вы можете увидеть

  • Function: Принимает один аргумент, производит один результат
  • Consumer: Принимает один аргумент, ничего не производит.
  • BiConsumer: Принимает два аргумента, ничего не производит.
  • Supplier: Не принимает никаких аргументов, приводит к одному результату.
  • Predicate: Булева функция значения одного аргумента

Вы можете использовали их в качестве входных данных для вашего метода и выполнить его внутри.

up 18 down

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

Типичные примеры:

  • Consumer<T> - метод, который принимает T и возвраты void
  • Function<T, R> - метод, который принимает T и возвраты R
  • Supplier<R> - метод, который не принимает никаких аргументов и возвращает R
  • Runnable - метод, который не принимает никаких аргументов и возвращает void
  • Predicate<T> - метод, который принимает T и возвраты boolean

В вашем случае, вы, кажется, после того, Runnable:

Runnable shortcutToMethod = () -> redundantMethod(game.getGraphics());
shortcutToMethod.run();
up 2 down

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

Есть целый ряд функциональных интерфейсов, доступных в Java (вы можете создать другие себя). Например, если ваш redundantMethod возвращает ничего, вы не можете использовать функциональный интерфейс, подходящий для этого:

private Consumer<Graphics> shortcutToMethod = 
           graphics -> redundantMethod(game.getGraphics());

Он может даже пойти со ссылкой методы:

private Consumer<Graphics> shortcutToMethod = this::redundantMethod; //some rules apply

И это можно назвать с:

shortcutToMethod.accept(game.getGraphics());

Consumer это один из функциональных интерфейсов, которые поставляются вместе с Java, и он объявляет абстрактный метод accept что называется выше. Есть другие, которые вы можете найти в java.util.function пакет, и вы выбираете или написать конкретный функциональный интерфейс на основе того, что сигнатура ваш конкретный метод имеет. Видеть пакет java.util.function для дополнительной информации.

up 1 down

Ну, в дополнение к тому, что другие уже писали. Предполагая, что ReturnType является «Графика» здесь являются 4 примера:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod();
}

//here you go and assing your variable
private FunctionDeclaration shortCutToMethod = game.getGraphics()::doThisMethod;
//or you want this - not sure?
// private FunctionDeclaration shortCutToMethod = game::getGraphics;
// and then you just call it:
shortCutToMethod.doThisMethod();

Если вы хотите передать графику

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod(Graphics g);
}
//assign your variable
private FunctionDeclaration shortCutToMethod = param -> param.doThisMethod();
//and call it - calls game.getGraphics().doThisMethod()
shortCutToMethod.doThisMethod(game.getGraphics());

Если «лишний» метод делает что-то:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod(Graphics g);
}
//assign your variable
private FunctionDeclaration shortCutToMethod = param -> redundantMethod(param.doThisMethod());
//and call it - calls redundantMethod(game.getGraphics().doThisMethod())
shortCutToMethod.doThisMethod(game.getGraphics());

Если избыточный метод делает что-то без прохождения графики:

//You need some kind of forward declaration, name don't matter:
public static interface FunctionDeclaration{
    public Graphics doThisMethod();
}
//assign your variable
private FunctionDeclaration shortCutToMethod = () -> redundantMethod(game.getGraphics().doThisMethod());
//and call it - calls redundantMethod(game.getGraphics().doThisMethod())
shortCutToMethod.doThisMethod();

И так далее... достаточно для прямой декларации вы можете использовать любой существующий интерфейс, как предопределённый Джо и другие упомянутого (например, поставщик) Конечно.

Ошибка 505

Что-то пошло не так

Попробуйте воспользоваться поиском