Этот вопрос относится к How to Queue and Call Actual Methods... Во всяком случае, я решил (в конце концов) пойти с анонимной идеей класса. Проблема в том, что когда я добавляю свой анонимный класс в связанный список, он фактически вызывает execute() немедленно ... и этого не должно быть. Выполнить() следует вызывать позже. Во всяком случае, это то, что у меня есть:Нечетный связанный список/поведение анонимного класса - выполняется при добавлении?
private LinkedList<AgentAction> actions;
public boolean blockingSensor;
this.actions.add(new AgentAction(this) {
public void execute() {
//setRotationalVelocity(0);
kinematic.setWheelsVelocity(0,0);
this.agent.setBlockingSensors(false);
this.agent.printLCD("Turn, blocking = "+this.agent.blockingSensor);
}
public Object getValue() {
return null;
}
});
//this is essentially the main()
public void performBehavior()
{
//make sure to only call run() each tick, not every ms
if (this.oldCounter < getCounter())
{
if (!isWorking())
{
run();
}
this.oldCounter = getCounter();
this.actions.removeFirst().execute();
}
}
abstract class AgentAction
{
SimbadAgent agent;
public AgentAction(SimbadAgent a)
{
this.agent = a;
}
public abstract void execute();
public abstract Object getValue();
}
бег() является абстрактным методом, который реализуется с помощью дочернего класса. Я просто не уверен, почему он печатает, когда он добавлен, а не выполнен. Я понимаю, это будет означать, что performBehavior() фактически выполняется несколько раз, а не один раз за галочку, но это не так.
Ваш образец кода не собирается компилироваться. Можете ли вы сделать это или добавить какой-то контекст? –
Хммм ... Я не думаю, что реальный код будет очень полезен, так что давайте посмотрим ... Существует класс под названием SimbadAgent, в котором находится функция executeBehavior(), а также другие методы. this.actions.add (новый AgentAction (this) {...}); вызывается внутри одного метода внутри SimbadAgent. К сожалению, я не уверен, есть ли еще что-то еще. Извините, если это не поможет. – nathas
Давайте тогда будем ясны. Нет, этот код не вызывает выполнение при добавлении действия. Вы не правы. Бремя лежит на вас, чтобы доказать обратное, а вы этого не сделали. Удачи вам получить бесплатную помощь, когда вы не хотите тратить время, предоставляя нам информацию, необходимую нам, чтобы помочь вам. Прочтите http://sscce.org и дайте нам один. –