Java 代码设计:自复位布尔。反对的理由?

Java 代码设计:自复位布尔。反对的理由?,java,Java,我在考虑一个get方法,它会自动重置。我的构造实际上也很有效。但我不确定我是否应该避免这种情况。 其思想是,在第一次“true”返回后,该值会自动重置。在这种情况下,get值是一个布尔值,它告诉我是否收到了答案。一旦我得到一个true,该成员应该将自己重置为false。否则,我将不得不手动执行此操作。 下面是我对这个想法的工作方法。如果该值为true,我将启动一个新的小线程,等待200ms并将成员重置回false。同时,旧值已经返回。 我的问题是,我可以/应该这样使用它,还是有一些主要的反对理由

我在考虑一个get方法,它会自动重置。我的构造实际上也很有效。但我不确定我是否应该避免这种情况。 其思想是,在第一次“true”返回后,该值会自动重置。在这种情况下,get值是一个布尔值,它告诉我是否收到了答案。一旦我得到一个true,该成员应该将自己重置为false。否则,我将不得不手动执行此操作。 下面是我对这个想法的工作方法。如果该值为true,我将启动一个新的小线程,等待200ms并将成员重置回false。同时,旧值已经返回。 我的问题是,我可以/应该这样使用它,还是有一些主要的反对理由?因为不知怎的,我有种感觉,这种方式不值得推荐

谢谢你的意见

public boolean isAck() {
    if (acknowledged){
    Thread th = new Thread() {
        public synchronized void run() {
            try {
                Thread.sleep(200);
                acknowledged = false;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };
    th.start();}
    return acknowledged;
}

根据你的评论,我会这样做-

public boolean isAck() {
  if (acknowledged) {
    setAck(false);
    return true;
  }
  return false;
}
如果你不喜欢这种方法;你可能更喜欢

public boolean isAck() {
  try {
    return acknowledged;
  } finally {
    setAck(false);
  }
}

根据你的评论,我会这样做-

public boolean isAck() {
  if (acknowledged) {
    setAck(false);
    return true;
  }
  return false;
}
如果你不喜欢这种方法;你可能更喜欢

public boolean isAck() {
  try {
    return acknowledged;
  } finally {
    setAck(false);
  }
}
那么这个呢:

public boolean isAck() {
   synchronized(this) {
      boolean result = false;
      if (acknowledged){
         result = true;
         acknowledged = false;
      }
    }
    return result;
}
那么这个呢:

public boolean isAck() {
   synchronized(this) {
      boolean result = false;
      if (acknowledged){
         result = true;
         acknowledged = false;
      }
    }
    return result;
}

为什么不立即重置它呢?您的访问器可能不应该也是变异器。你希望你发布的代码做什么?我不确定你通过重置值来实现什么。但是,您正在生成一个线程来重置它,如果您的应用程序尝试再次访问isAck.attributes in codereview.stackexchange.com中的isAck.attributes,您将遇到某种并发问题如果您要设置
acknowledged=true
,然后在循环中调用
isAck()
,您能预测哪个迭代会返回false吗?为什么不立即重置它?您的访问器可能也不应该是变异器。你希望你发布的代码做什么?我不确定你通过重置值来实现什么。但是,您正在生成一个线程来重置它,如果您的应用程序尝试再次访问isAck.attributes in codereview.stackexchange.com中的isAck.attributes,您将遇到某种并发问题如果您要设置
acknowledged=true
,然后在循环中调用
isAck()
,您能预测哪个迭代将返回false吗?