Хорошие объяснения, почему вы не можете делать то, что вы пытаетесь сделать уже предоставленным. В качестве решения можно подумать:
public class foo
{
static class priceInfo
{
public double lastPrice = 0;
public double price = 0;
public Price priceObject = new Price ();
}
public static void main ( String args[] )
{
int period = 2000;
int delay = 2000;
final priceInfo pi = new priceInfo ();
Timer timer = new Timer ();
timer.scheduleAtFixedRate ( new TimerTask ()
{
public void run ()
{
pi.price = pi.priceObject.getNextPrice ( pi.lastPrice );
System.out.println ();
pi.lastPrice = pi.price;
}
}, delay, period );
}
}
Похоже, что вы могли бы сделать лучший дизайн, чем это, но идея состоит в том, что вы можете группировать обновленные переменные внутри ссылки класса, которая не изменяется.
Если мне позволят рассуждать в Smalltalk, где блоки являются объектами класса BlockClosure
, я бы предположил, что вы представляете свойство , которое вы хотите количественно определить как блок p
. [ 1121]
Для простоты предположим, что свойство зависит от одного параметра x
. Тогда p(x)
будет соответствовать выражению Smalltalk
p value: x
, которое оценивает блок p
, используя аргумент x
.
Таким образом, вы можете реализовать метод Smalltalk forAll:
в классе BlockClosure
как:
forAll: aCollection
aCollection do: [:x | (self value: x) ifFalse: [^false]].
^true
, который проверяет, что свойство p
, представленное блоком получателя, оценивается как true
] для всех элементов в aCollection
(вашей вселенной).
Если ваша вселенная не меняется (обычный случай в контексте проблемы), и какие изменения это свойство, вы можете определить класс Universe
, который будет содержать коллекцию элементов в своей переменной экземпляра [ 1115]. Затем вы можете реализовать в Universe
forAll: aProperty
^aProperty forAll: contents
, где внутреннее сообщение forAll:
- это сообщение, реализованное в BlockClosure
.