Java может сохранить методы в массивах?

Хорошо я написал некоторый код и все, что я делал, был для циклов, но изменение, какой метод я назвал. Я пытался использовать для цикла, таким образом, это будет немного более опрятно (и из любопытства, чтобы видеть, могло ли это быть сделано), но это не компилирует, когда я делаю это этот путь, потому что это не распознает объект в массиве как метод, я думаю. Это - то, что я имею:

String[] moveArray = {moveRight,moveDown,moveLeft,moveUp};
for (i = 0; i < 4; i++) {
    while (myWumpus.moveArray[i]) {
        myWumpus.moveArray[i];
        generator.updateDisplay();
    }
}

Когда я пробую компиляцию, я добираюсь

not a statement myWumpus.moveArray[i]();
';' expected myWumpus.moveArray[i]();

(Это относится к первому оператору в цикле с условием продолжения),

Так, я думаю, что это, возможно, потому что я делаю это Массивом Строки типа? Существует ли Метод типа? Это вообще возможно? Любые приветствующиеся решения:). Кроме того, я могу заставить это работать с помощью 4 циклов с условием продолжения, таким образом, Вы не должны показывать мне то решение. Спасибо!

11
задан Paul 31 January 2010 в 18:20
поделиться

4 ответа

Вы не можете хранить методы непосредственно в массивах. Однако вы можете хранить объекты, которые реализуют тот же метод по-разному. Например:

Mover[] moveArray = {new RightMover(), new DownMover() new LeftMover(), new UpMover() };
for (i = 0; i < 4; i++) {
    while (myWumpus.moveArray[i]) {
        moveArray[i].move();
        generator.updateDisplay();
    }
}
16
ответ дан 3 December 2019 в 02:19
поделиться

Я не вижу ничего принципиально плохого в вашем коде. Чтобы сузить проблему, я попробовал другой подход, который может быть минимально быстрее, но разница почти ничтожна:

class Area(gtk.DrawingArea):
    def do_expose_event(self, event):
        cr = self.window.cairo_create()

        # Restrict Cairo to the exposed area; avoid extra work
        cr.rectangle(event.area.x,
                     event.area.y,
                     event.area.width,
                     event.area.height)
        cr.clip()

        cr.set_line_width(4)
        for i in range(num):
            cr.set_source_rgb(1, 0, 0)
            cr.arc(x[i], y[i], 8, 0, 2 * math.pi)
            cr.stroke_preserve()
            cr.set_source_rgb(1, 1, 1)
            cr.fill()
            x[i] += xv[i]
            y[i] += yv[i]
            if x[i] > size or x[i] < 0:
                xv[i] = -xv[i]
            if y[i] > size or y[i] < 0:
                yv[i] = -yv[i]
        self.queue_draw()

gobject.type_register(Area)

# Initialize the window.
window = gtk.Window()
window.resize(size, size)
window.connect("destroy", gtk.main_quit)
darea = Area()
window.add(darea)
window.show_all()

Кроме того, переопределение DrawingArea.draw () заглушкой не имеет большого значения.

Я, вероятно, попробовал бы Каирский список рассылки, или посмотрел бы на Clutter или pygame, чтобы нарисовать большое количество пунктов на экране.

-121--3147227-

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

В качестве примера полиморфизма по отношению к вашей проблеме - скажем, вы создали интерфейс следующим образом:

public interface MoveCommand {
    void move();
}

Вы можете создать реализации следующим образом:

public class MoveLeftCommand implements MoveCommand {
    public void move() {
        System.out.println("LEFT");
    }
}

и т.д. для других опций перемещения. Затем их можно сохранить в MireCommand [] или коллекции, например List < MireCommand > , а затем выполнить итерацию над массивом/коллекцией, вызывающим move () для каждого элемента, например:

public class Main {

    public static void main(String[] args) {
        List<MoveCommand> commands = new ArrayList<MoveCommand>();
        commands.add(new MoveLeftCommand());
        commands.add(new MoveRightCommand());
        commands.add(new MoveLeftCommand());

        for (MoveCommand command:commands) {
            command.move();
        }
    }

}

Полиморфизм очень силен, и выше приведен очень простой пример чего-либо, называемого Command Образца . Наслаждайтесь остальной частью реализации Wumpus World:)

-121--3235624-

Вы не можете вызывать такие методы. Но вы можете использовать отражение:

Просто измените первую строку в while-loop на:

Method m = myWumps.getClass().getMethod(moveArray[i]); // if the method is void
m.invoke(myWumps);

(вам придется объявить/поймать несколько исключений)

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

5
ответ дан 3 December 2019 в 02:19
поделиться

Нельзя хранить методы в массивах на Java, так как методы в Java не являются первоклассными объектами. Это причина, по которой некоторые предпочитают использовать другие языки, такие как Python, Scheme и т.д.

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

6
ответ дан 3 December 2019 в 02:19
поделиться

Вместе с javascripts для отслеживания событий GUI и создания сценариев новых элементов HTML 5, вы получаете много того, что предлагает Flash.

HTML- 5 содержит ряд новых элементов. Один из них называется Холст. С его помощью вы можете нарисовать все, что хотите, на экране, в пределах его границ. Вы используете javascript, чтобы нарисовать на нем, и вы можете поймать любые mouseclicks и тому подобное с javascript тоже. Если вы используете инструменты графического интерфейса на рабочем столе, такие как Tk, GTK, вы можете сравнить эти новые элементы с некоторыми виджетами этих инструментов графического интерфейса.

Посмотрите на jit , чтобы увидеть пример графиков в HTML 5

-121--1836520-

Невозможно хранить методы в массивах Java, поскольку методы не являются первоклассными объектами Java. Это причина, почему некоторые люди предпочитают использовать другие языки, такие как Python, Scheme и т.д.

Рабочая группа состоит в том, чтобы создать интерфейс, который содержит один метод, а затем создать четыре класса, реализующих этот интерфейс - MireRight, MireLeft и т.д. классы. Затем можно хранить экземпляры этих классов в массиве и вызывать их одинаково.

-121--3235623-

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

В качестве примера полиморфизма по отношению к вашей проблеме - скажем, вы создали интерфейс следующим образом:

public interface MoveCommand {
    void move();
}

Вы можете создать реализации следующим образом:

public class MoveLeftCommand implements MoveCommand {
    public void move() {
        System.out.println("LEFT");
    }
}

и т.д. для других опций перемещения. Затем их можно сохранить в MireCommand [] или коллекции, например List < MireCommand > , а затем выполнить итерацию над массивом/коллекцией, вызывая move () для каждого элемента, например:

public class Main {

    public static void main(String[] args) {
        List<MoveCommand> commands = new ArrayList<MoveCommand>();
        commands.add(new MoveLeftCommand());
        commands.add(new MoveRightCommand());
        commands.add(new MoveLeftCommand());

        for (MoveCommand command:commands) {
            command.move();
        }
    }

}

Полиморфизм очень силен, и выше приведен очень простой пример того, что называется Command Pattern . Наслаждайтесь остальной частью реализации Wumpus World:)

6
ответ дан 3 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: