Приложение может работать в двух режимах - «в реальном времени», где оно смотрит на каждое обновление до состояния мира или «отбирается», когда оно смотрит только на состояние мира каждые три миллисекунды ,Имитация ADT в Java
Если бы я писал Haskell (или любой другой язык с АТД) Я бы смоделировать это как
data Mode = RealTime | Sampled Int
, который может быть использован следующим способом типобезопасного
case mode of
RealTime -> -- do realtime stuff
Sampled interval -> -- do sample stuff with 'interval'
Я говорю, что он «безопасен по типу», потому что если вы работаете в режиме реального времени, вам не удается получить доступ к полю interval
(который предоставляется в то время, когда он вам нужен, если вы работаете в режиме дискретизации).
Как смоделировать одно и то же в Java безопасным способом? То есть, я хочу
- Для определения класса (или перечисления), который отличает между этими двумя режимами, и
- Чтобы запретить доступ к
interval
полю в режиме реального времени, и - Чтобы все это проверено компилятором.
Возможно ли это на Java? Если нет, то каков идиоматический способ достижения такого рода безопасности?
Спасибо, это выглядит как лучший способ пойти. Можем ли мы избежать определения класса «ModeVisitor» в Java 8 с помощью lambdas вместо этого (например, «public accept (Function visitor)) или вы что-то теряете, делая это? –
@ChrisTaylor: вам нужен посетитель, потому что сам метод 'visit' перегружен, и каждый подкласс« Mode »должен выбрать соответствующую перегрузку. – pyon
@ChrisTaylor: конкретный посетитель фактически может считаться пакетом, содержащим * несколько * lambdas: по одному для каждого варианта ADT.Посетители аналогичны результату применения функций 'возможно' и' либо' (от стандартной библиотеки Haskell) до двух аргументов: 'возможно, foo bar' будет использовать' foo' для посещения 'Nothing' и' bar' для посещения 'Just x'. – pyon