【问题标题】:Only execute once in a while loop在while循环中只执行一次
【发布时间】:2023-04-02 01:00:01
【问题描述】:

我有一种方法可以将对象添加到队列并检查队列大小。如果队列大小达到最大容量,则会发出警报并且队列将删除第一个对象。以下是代码

private SomeQueue queue;
private boolean raiseAlarmOnce = true;
private boolean alarmRaised;
private AlarmConnection alarmConnection;

void addToQueue(Object obj) {

     queue.add(obj);

     while (queue.size() > 1000) {
         queue.remove(); 

         if (m_raiseAlarmOnce) {
            // raiseAlarm mtheod will return boolean value to indicate 
            // the result of raising alarm
            m_alarmRaised = alarmConnection.raiseAlarm();
            raiseAlarmOnce = false;
         }
      }
      m_raiseAlarmOnce = true;

      if (m_alarmRaised) {
         alarmConnection.clear();
         m_alarmRaised = false;
      }
   }

如果队列大小大于 1000,队列将不断删除 obj,并且只发出一次警报。如果警报成功发出,警报将被清除。只是想知道有什么更好的方法吗?

【问题讨论】:

  • 请提供一个没有任何编译错误的代码示例。
  • 这段代码有问题还是您在寻找code review
  • @Abion47 这是一个大体思路,不是详细代码。我只是想确定在 while 循环中只执行一次的最佳做法是什么
  • raiseAlarm = queue.size() > 1000; 该部分不需要循环

标签: java while-loop boolean


【解决方案1】:

如果您需要发出一次警报,当队列大小为 1001、1002 等而不是每次迭代一次时,请在使用标志时发出警报

我建议在使用线程或单例实例时使用局部变量

void addToQueue(Object obj) {

     queue.add(obj)
     boolean raisAlarm = false;

     while (queue.size() > 1000) {
         queue.remove(); 
         raisAlarm  = true;
      }


      if (raisAlarm) {
            // raiseAlarm mtheod will return boolean value to indicate 
            // the result of raising alarm
            boolean m_alarmRaised = alarmConnection.raiseAlarm();
            if (m_alarmRaised) {
              alarmConnection.clear();
            }
     }
}

【讨论】:

    最近更新 更多