0

在这个服务器应用程序中,我正在扩展一个带有方法的类 EventManager:

pubic void addEvent(Event event, int time){ // code to process handling of events }

事件是和接口。我有几个类,我需要在其中运行一个使用许多相同方法的非常相似的事件。我没有在我运行类似事件的每个类中重写这些方法中的每一个,而是认为如果我创建了实现事件并在其中包含每个方法的公共类:

public class someEvent impements Event{


    public void send(String message){

          for (int i = 0; i < Server.playerHandler.players.length; i++) {
            if (Server.playerHandler.players[i] != null) {
                    if (Server.playerHandler.players[i].inPcGame()) {
                            Client c = (Client)Server.playerHandler.players[i];
                            c.sendMessage(message);
                    }                      
            }              
    }

    }
    public void spawn(int[] npcs, wave){ 

        int x = 4234;
        int y = 2343;
        int z = 1;
        int health = 10 * wave;
        int maxHit = 5 * wave ;
        int attack = 150;
        int defence = 200;
        NpcHandler.getNpcHandler().spawnNpc(c, 1, x, y, z, 0, health, maxHit, attack, defence, true, false);

   }

    // Event method override
    public void executeEvent(){

         spawn(npcList, waveNum);
         send(message);

    }
}

然后使用在每个运行事件的类中创建对象。然后将这些对象传递给 EventManager。

我自学并且仍在学习,我的朋友也自学,但编程时间更长,他说我应该这样做并且应该这样做:

import sever.event.EventManager;

public class someClass {

    public void send(String message){

          for (int i = 0; i < Server.playerHandler.players.length; i++) {
            if (Server.playerHandler.players[i] != null) {
                    if (Server.playerHandler.players[i].inPcGame()) {
                            Client c = (Client)Server.playerHandler.players[i];
                            c.sendMessage(message);
                    }                      
            }              
    }

    }
    public void spawn(int[] npcs, wave){ 

        int x = 4234;
        int y = 2343;
        int z = 1;
        int health = 10 * wave;
        int maxHit = 5 * wave ;
        int attack = 150;
        int defence = 200;
        NpcHandler.getNpcHandler().spawnNpc(c, 1, x, y, z, 0, health, maxHit, attack, defence, true, false);

   }

    EventManager.getSingleton().addEvent( new Event(){

        public void executeEvent(){

            spawn();
            send();

    }}, 12000


    );
}

并在每个类中执行此操作,重写我使用事件的每个类中的每个方法。

他坚持认为我的方式使用更多内存并且是 CPU 密集型的。我不明白我的方式如何在 CPU 上更重,而不是比他的方式更不密集。哪种方式是正确的方式,为什么?

4

3 回答 3

1

您可能希望将所有事件都放在一个文件中。哎呀。

像这样...

class BaseEvent {
  // every event logs
  public void fireEvent( Event e ) {
    log.print( event );
  }
  String toString() {
    return getClass.getName();
  }
}

class PlayerEvent extends BaseEvent {
  player p; // every player event has an associated player (and logs, and has a toString method..)
  public void fireEventWithPlayer( Player x, Game g ) {
      g.spawn( x );
      super.fireEvent( this ); ///
  }
}

class GameEvents implements BaseEvent {
  startGame, endGame, createGame, ... 
}

/// just where should the spawn event be?

/// then add the event manager, 
/// a main method that goes through all the steps, so you can see how your logs will look...
/// and at the end pre-define all your events.
/// you'll have **lots** of events in categories (player, game, network, etc.)

回答问题?以您朋友建议的方式实现接口几乎与创建在声明点范围内的匿名内部类相同。每次调用都会创建一个新实例,通过“接口方法”传递的数据量取决于声明范围内的数据量。
对于预定义的事件,数据很低,cpu 很快。更多的类比更多的定义更好。

如果您提前足够多地声明内容,JVM 可以优化猫。你的朋友是对的,如果你是用 C 语言编写的,或者是一种无类型的动态语言,甚至是一个不能很好优化的 JVM。从语法上讲,您需要记住该事件将在事件管理器中运行'


于 2013-08-24T10:10:06.060 回答
1



也许你是对的,你朋友的错,虽然
你可能错了,你朋友的错,虽然

你想要的是基类中的实用方法:

你的朋友可能想要的是事件管理器拥有发生异常时关闭:

事件每次都是完全相同的事件。它们可以成为项目的唯一动力;你想在前面看到它们。

class AWholeProgram {

    static EventManager E = new EventManager();

    public static void main(String[] args) {

        E.add (  new PhoneCall("15555551212")  );
        E.add(  PrintBatteryLevel  );
        E.add(  PlaySong  );
        E.add(  WaitForIncomingCall  );

    }

    // so the "events", the only things that can happen, are up front...
    final static Event PrintBatteryLevel = ...;
    final static Event PlaySong  = ...;
    final static Event WaitForIncomingCall  = ...;
    final static Event PhoneCall = new phoneCall("15555551212")...;


    class phoneCall extends Event {
        long number = Long.parseString("15555551212");
        phoneCall( String s ) {
          //convert to digits, and look in the phone book, and see if its long distance, etc.
        }
        public void fireEvent() {
           // makes the phone call
        }        
    }

}

电话号码在哪里有很大的不同。如果隐藏在事件管理器类中,嘿嘿......

程序做
什么真的很明显,程序可以做什么也很明显,
而且更好的是,程序不做任何其他事情真的很明显.

许多程序以 gui、帧打包和诸如此类的方式启动,并且在某些处理程序中,有一个按钮,如果单击该按钮,则会删除文件,或者更糟。哎哟..

于 2013-08-24T09:30:47.283 回答
0

你的方法有两个变量

addEvent(事件事件,int时间)

它将如何与不同的签名一起工作?

于 2013-08-24T08:55:57.360 回答