2017-01-06 2 views
0

Так что я хочу создать массив, в котором есть методы. Например:Ввод метода в массив

public static void givePointBoost(){ 
points += 30}; 

или

public static void giveSword(){ 
Actions.giveItems(Items.diamond_sword); 
Actions.givePotion(Potions.slowness);}; 

Как вы можете видеть, как эти методы являются пустотами. То, что я хочу сделать, это иметь массив, в котором есть все эти пустоты, чтобы я мог выбрать случайный метод из него позже. Но я не могу поместить его в массив, потому что он говорит, что я не могу иметь массив пустот. Когда я пытаюсь сделать его массивом объектов, он говорит, что он не может переключиться с объекта на void. Так что я задал себе вопрос:

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

+1

Читайте о [лямбда] Выражения (http://stackoverflow.com/documentation/java/91/lambda-expressions). –

+0

Java не поддерживает методы ввода в массивы. Однако он может помещать объекты в массивы. Вы можете определить интерфейс, который имеет только один метод, и поместить объекты, реализующие этот интерфейс, в массив – Felk

+0

You Cant. Однако вы можете создать функциональный интерфейс, а затем использовать lambdas для заполнения массива. Затем вы можете создать ссылку на интерфейс и назначить его случайной реализации из массива. – SteelToe

ответ

0

Давайте разобраться.
Массивы на Java могут содержать только объекты или примитивы.
Коллекции на Java могут содержать только объекты.
То, что вы ищете, называется Command Pattern. https://www.tutorialspoint.com/design_pattern/command_pattern.htm

У вас будет список объектов, каждый из которых будет иметь один метод, скажем, «выполнить». При полиморфизме каждый из этих объектов будет делать что-то другое.

Вот пример:

import java.util.ArrayList; 
import java.util.List; 

public class CommandPatternExample { 
    public static void main(String[] args) { 


     List<Command> commands = new ArrayList<>(); 
     commands.add(new GiveBoostCmmand("knight")); 
     commands.add(new GiveItemCommand("sword", "knight")); 

     for (int i = 0; i < 3; i++) { 
      commands.get((int)(Math.random() * commands.size())).execute(); 
     } 


    } 

    public interface Command { 
     void execute(); 
    } 

    static class GiveBoostCmmand implements Command { 
     private String targetName; 

     public GiveBoostCmmand(String targetName) { 
      this.targetName = targetName; 
     } 

     public void execute() { 
      System.out.println("Boosting " + this.targetName); 
     } 
    } 

    static class GiveItemCommand implements Command { 

     private String itemName; 
     private String targetName; 

     public GiveItemCommand(String itemName, String targetName) { 
      this.itemName = itemName; 
      this.targetName= targetName; 
     } 

     public void execute() { 
      System.out.println("Giving " + this.itemName + " to " + this.targetName); 
     } 
    } 
} 
+0

Когда я это делаю, он дает мне ошибку в части .add команды. В нем говорится: «Синтаксическая ошибка на токене. Неверные конструкты. Синтаксическая ошибка при добавлении. Равные значения, ожидаемые после этого токена». Я пробовал делать обе эти вещи, и появилось больше ошибок. Кроме того, я должен импортировать классы из java.util? – Ptolemy2002

+0

Я обновил свой ответ с полным примером, включая импорт. –

+0

Почему компьютер не позволяет мне статизировать класс? – Ptolemy2002

0

Вы пытаетесь сказать, что вы хотите, чтобы результат метода, который будет добавлен в массив?

Насколько я знаю, я не думаю, что вы можете поместить метод внутри массива.

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

0

Главный вопрос: зачем вам нужны методы в массиве?

Другие решения с использованием шаблона Command - отличное решение. Но, видя свой код, я считаю, что вы также должны поместить этот шаблон в специализированный класс, целью которого будет инициализировать пул возможных действий и выбрать его случайным образом, когда вам нужно.

Что бы перевести на следующий UML

|RandomActionCaller  | 
|------------------------| 
|- List<Command> commands| 
|------------------------| 
|+ selectRandomEffect() | 

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

Выбор метода случайного эффекта будет выбирать только случайное число между 0 и commands.size() - 1, получить экземпляр команды и выполнить его. Если вам нужно выполнить его где-то еще в своем коде, просто верните его из метода выбора случайного эффекта.

+0

Не отвечайте на вопрос, предлагая решение вопроса, о котором не просил ОП. Вы должны добавить это как комментарий к вопросу. Я понимаю, что у вас есть лучшие намерения, и вы довольно новичок в SO, поэтому я не буду понижать его =). Вы должны подумать об удалении этого ответа. –

+0

Мне бы хотелось добавить это как комментарий, но я не могу с моей репутацией, я понимаю, почему существует такое ограничение, но это мешает моей способности помогать OPs вовремя, как этот. –

+0

Хмм ... Мне нравится эта идея. Не могли бы вы объяснить больше об этом? – Ptolemy2002

2

В Java у вас нет делегатов или указателей функций, которые вы можете хранить в коллекциях или массивах, подобных объектам, поэтому для достижения этой цели вам необходимо использовать Command Pattern. В принципе, вы переносите метод в объект, который вы передаете. Получатель может получить доступ к этому методу через объект.

  • Создать командный интерфейс:

    interface ICommand { 
        public void execute(); 
    } 
    
  • Wrap метод (или несколько) в классе через наследование ...

    class SpecificCommand implements ICommand { 
        public void execute() { 
         // Do something... 
        } 
    } 
    
  • ... или оберните существующие методы непосредственно в анонимном классе:

    class SomeClass { 
    
        private void someMethod(int someValue) { 
         // Some stuff... 
        } 
    
        public static void main(String[] args) { 
    
         List<ICommand> commands = new ArrayList<>(); 
    
         // Do something... 
    
    
         // Add command directly 
         ICommand command = new ICommand() { 
          @Override 
          public void execute() { 
           someMethod(42); 
          } 
         } 
    
         // Do something.... 
    
        } 
    } 
    
  • Вызов команды из списка в цикле (или одной):

    for (ICommand command : commands) { 
        command.execute(); 
    } 
    

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

  • Нет связанных вопросов^_^