Aplikacja może działać w dwóch trybach - "w czasie rzeczywistym", w której analizuje każdą aktualizację do stanu świata, lub "próbkowaną", gdy patrzy tylko na stan świata co T milisekund .Symulowanie ADT w Javie
Gdybym pisanie Haskell (lub dowolnego języka z ADTS) bym tego modelu jako
data Mode = RealTime | Sampled Int
które mogą być wykorzystane w następujący typu bezpieczny sposób
case mode of
RealTime -> -- do realtime stuff
Sampled interval -> -- do sample stuff with 'interval'
powiedzieć, że jest "bezpieczny dla typu", ponieważ jeśli pracujesz w trybie czasu rzeczywistego, nie możesz próbować uzyskać dostępu do pola interval
(które jest dostępne w momencie, gdy jest potrzebne, jeśli pracujesz w trybie próbkowania).
Jak mogę modelować to samo w Javie w bezpieczny sposób? Oznacza to, że chcę
- Aby zdefiniować klasę (lub enum), który odróżnia między tymi dwoma trybami i
- Aby zabronić dostępu do pola
interval
w trybie czasu rzeczywistego, a - Aby mieć wszystko to sprawdzane przez kompilator.
Czy to możliwe w Javie? Jeśli nie, jaki jest idiomatyczny sposób osiągnięcia tego rodzaju bezpieczeństwa?
Dzięki, to wygląda najlepiej. Czy możemy uniknąć definiowania klasy 'ModeVisitor' w Javie 8, używając zamiast niej lambdas (np.' Publiczny akceptuje (funkcja )) lub czy coś w tym traci? –
@ChrisTaylor: Potrzebujesz gościa, ponieważ sama metoda 'visit' jest przeciążona, a każda podklasa" Mode "musi wybrać odpowiednie przeciążenie. – pyon
@ChrisTaylor: Właściwy użytkownik może być traktowany jako pakiet zawierający * kilka * lambd: jeden dla każdego wariantu ADT.Odwiedzający są analogiczne do wyników stosowania funkcji 'maybe' i' either' (ze standardowej biblioteki Haskella) do dwóch argumentów: 'maybe foo bar' użyje' foo' do odwiedzenia 'Nothing' i' bar' do odwiedzenia 'Just x'. – pyon