我已经使用Checkstyle一段时间了,知道什么是幻数,但是我从未以这种方式遇到过它,它只是一个分配数据的开关,但是这些案例被标记为幻数,我无法使它们决赛或类似的事情(我知道)。我创建的程序获取一个随机数(从0到199的整数),并在开关中使用它,不仅如此,而且在ra.nextInt(200)中也使用了200。也是“魔术”。
我的问题是,如何在不声明200个新变量的情况下防止案例滥用魔术数字?
这是我的代码:
public Basura selectB(final Basura b) {
private Random ra = new Random();
ran = ra.nextInt(200);
switch (ran) {
case 0: b.setName("Funko Roto");
b.setClasification("PL"); break;
case 1: b.setName("Bateria de Laptop");
b.setClasification("B"); break;
case 2: b.setName("Sobras de Comida");
b.setClasification("O"); break;
case 3: b.setName("Clips de Oficina");
b.setClasification("M"); break;
case 4: b.setName("Colcha Deshilachada");
b.setClasification("T"); break;
case 5: b.setName("Disco DVD");
b.setClasification("B"); break;
...
default:b.setName("ERROR");
b.setClasification("E"); break;
}
return b;
}
您可以将此事物列表外部化为文本文件,并使程序将文件内容读取到数组中。您可以将其放置在代码中的硬编码位置,或配置位置,也可以将其放置在类路径(如果使用maven约定,则为src / main / resources),然后使用Class.getResourceAsStream读取它。 >
将分类与名称存储在同一行,并用定界符分隔,例如:
Sobras de Comida|O Colcha Deshilachada|T
等数组长度是传递给nextInt的值。
文件的内容被加载到数组中。摆脱开关,并使用随机值索引数组以获取您的字符串。然后,您可以分割字符串并在要返回的pojo上设置字段。
[采用这种方法:
没有魔术数字。
更容易更新列表。
您可以删除一堆重复的低价值代码。