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