Na własne potrzeby napisałem kawałek kodu javy, który symuluje rzuty kostkami. Głowna zasada, która mi przyświecała – wywołanie musi być łatwe w użyciu i rozszerzalne.
Standardowo w takich wypadkach tworzymy klasę użytkową ze statycznymi metodami. W takim wypadku wywołanie wygląda tak:
1 | int diceRoll= Dice.k6() |
Jest ok, ale nie jest świetne - trudno przypisać odgórnie rodzaj kostki do obiektu wymagającego kostkę zanim nastąpi test.
Wykorzystałem w takim razie możliwość stworzenia enum-a w javie. Sposób wywołania trochę się zmienił:
1 | int diceRoll = Dice.k6.roll(); |
Dodatkowo łatwo zapamiętać w dowolnym obiekcie jakiego rodzaju kości obsługuje.
1 | objWithDice.setDice(Dice.k6); |
W efekcie powstał enum wywołujący rzuty kością przez refleksję metod klasy ze statycznymi metodami.
Poniżej kod enuma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | enum Dice { k4("k4"), k6("k6"), k8("k8"), k10("k10"), k12("k12"), k100("k100"); private Logger log = Logger.getLogger(Dice.class.getName()); private String rollType; Dice(String rollType) { this.rollType = rollType; } public int roll() { try { Method m = Dices.class.getDeclaredMethod(rollType); m.setAccessible(true); return (Integer) m.invoke(Dices.class); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException ex) { log.log(Level.SEVERE, "Blad losowania dla " + rollType, ex); } return -1000; } } |
klasy, która zawiera rzuty kostką:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class Dices { private Dices() { } public static int k4() { int min = 1; int max = 4; return roll(min, max); } public static int k6() { int min = 1; int max = 6; return roll(min, max); } public static int k8() { int min = 1; int max = 8; return roll(min, max); } public static int k10() { int min = 1; int max = 10; return roll(min, max); } public static int k12() { int min = 1; int max = 12; return roll(min, max); } public static int k20() { int min = 1; int max = 20; return roll(min, max); } public static int k100() { int min = 1; int max = 100; return roll(min, max); } private static int roll(int min, int max) { return new Random().nextInt((max - min) + 1) + min; } } |
oraz testu użycia:
1 2 3 4 5 6 7 8 9 10 11 | public class TestUtils { private static Logger log = Logger.getLogger(TestUtils.class.getName()); public static void main(String[] args) { int k4= Dice.k4.roll(); log.log(Level.INFO, "test k4 :" + k4); int dice2k6 = Dice.k6.roll() + Dice.k6.roll(); log.log(Level.INFO, "test 2k6 :" + dice2k6); int dice2k10 = Dice.k10.roll() + Dice.k10.roll(); log.log(Level.INFO, "test 2k10 :" + dice2k10); } } |
Działa dobrze, jest łatwe w użyciu i bez problemu można dodać kolejne kości, gdyby ktoś potrzebował.
Do podświetlenia składni użyłem: http://hilite.me/.
Projekcik napisany w Javie w najlepszym dostępnym środowisku programistycznym: IntelliJ IDEA 14
Brak komentarzy:
Prześlij komentarz
Tu możesz wstawić swój komentarz