2013-07-02 3 views
-1

Как я могу отложить возврат varaible из метода на Java или как это сделать, если это нежелательно?Возврат переменной Java задержка

Рассмотрим это:

public class Transaction { 
    public int addInsert() { 
     ... 
     return insertId; 
    } 

    public boolean addUpdate() { 
     ... 
     return updateSuccesful; 
    } 

    public void commit() { 
     /* Calls everything that is inserted via addInsert or addUpdate. */ 
    } 
} 

Теперь предположим, что вы используете код, как:

Transaction transaction = new Transaction(); 
int insertedId = transaction.addInsert(); 
boolean updateSuccesful = transaction.addUpdate(); 
//insertId, updateSuccesful cannot be known yet 

transaction.commit(); 
//now insertId, updateSuccesful should be filled in 

Так что возвращение может произойти только тогда, когда transaction.commit() был вызван.

Любые мысли?

+1

Как вы планируете возвращать как 'int', так и' bool' из метода void? – thatidiotguy

+0

Моя первая мысль, что я не могу правильно понять, что вы имеете в виду. Попробуйте уточнить свой вопрос. – Andremoniy

+0

Вместо того, чтобы откладывать что-то (что вряд ли возможно в вашем сценарии) работать над вашим потоком управления .... – jlordo

ответ

1

Вы, к примеру, как единица работы Выкройка: http://martinfowler.com/eaaCatalog/unitOfWork.html Что также показывает ответ на ваш вопрос. Вы не можете на самом деле вызывать метод a, и иметь его возвращаемое значение задерживается до тех пор, пока вы не назовете метод b, не вдаваясь в потоки, и это все равно будет чрезмерно сложным и очень хрупким решением проблемы. Вместо этого вызывается метод a, метод b и т. Д. Однако на самом деле не выполняйте работу до тех пор, пока не произойдет фиксация. Затем коммит возвращает или вы можете вызвать getMethodAStatus() и т. Д.

+0

Имеет смысл, но сложно создать функцию 'getXXX()', так как возвращаемые значения могут быть логическими и целочисленными смешанными interchangebly, и, кроме того, число, если 'add()' операторов ограничено только некоторым конечным номер. – skiwi

+0

Сделайте заявления «добавить» следуйте за командным шаблоном. Затем добавьте каждую команду в свою единицу работы. Затем вы можете вытащить и запросить каждое добавление. –

2

Вы можете достичь этой функциональности с помощью многопоточности и делает потоки, выполняющиеся эти два метода .wait() пока метод commit() не вызывает .notify(), чтобы сообщить им, что они могут закончить.

Однако лучший способ структурировать это состоит в том, чтобы реорганизовать ваши методы, возможно, сделав commit возвратом insertedID и сделайте его return -1, если он не увенчался успехом. Таким образом, вы можете проверить логическое значение, увидев, что оно равно -1 или нет, и вы можете прочитать идентификатор, прочитав возврат фиксации.