2014-04-28 2 views
2

Я думал о методе get, который сбрасывается. Конструкция у меня тоже работает. Но я не уверен, что мне следует избегать этого. Идея состоит в том, что после первого «истинного» возврата значение автоматически сбрасывается. В этом случае значение get является булевым, что говорит мне, получил ли я ответ. Как только я получу правду, член должен вернуться к false. В противном случае мне пришлось бы сделать это вручную. Ниже приведен мой рабочий метод get для этой идеи. Если значение s true, я запускаю новый небольшой поток, который ждет 200 мс и возвращает элемент обратно в значение 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; 
} 
+2

почему не сразу сбросить его? –

+2

Ваши аксессоры, вероятно, также не должны быть мутаторами. Что вы ожидаете от своего опубликованного кода? –

+1

Я не совсем уверен, что вы пытаетесь выполнить, сбросив значение. Однако вы создаете поток для его сброса, и вы столкнетесь с какой-то проблемой параллелизма, если ваше приложение снова попытается получить доступ к isAck. –

ответ

3

на основе ваших комментариев, я хотел бы сделать что-то вроде этого -

public boolean isAck() { 
    if (acknowledged) { 
    setAck(false); 
    return true; 
    } 
    return false; 
} 

, если вам не нравится такой подход; Вы могли бы предпочесть

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

Спасибо большое :) Я чувствую себя немного глупо сейчас. Жизнь может быть такой простой ... –

1

Что об этом:

public boolean isAck() { 
    synchronized(this) { 
     boolean result = false; 
     if (acknowledged){ 
     result = true; 
     acknowledged = false; 
     } 
    } 
    return result; 
} 
Смежные вопросы