Java 交换机上的MVN幻数

Java 交换机上的MVN幻数,java,maven,switch-statement,checkstyle,magic-numbers,Java,Maven,Switch Statement,Checkstyle,Magic Numbers,我处理Checkstyle已经有一段时间了,我知道什么是幻数,但是我从来没有遇到过这种情况,它只是一个分配数据的开关,但是案例被标记为幻数,我不能使那些是最终的或类似的(我知道)。 我创建的程序得到一个随机数(int从0到199),并在开关中使用它,不仅如此,在ra.nextInt(200)中也使用它;也是“魔术” 我的问题是,我如何避免案例变成神奇的数字,而不必声明200个新变量 这是我的代码: public Basura selectB(final Basura b) {

我处理Checkstyle已经有一段时间了,我知道什么是幻数,但是我从来没有遇到过这种情况,它只是一个分配数据的开关,但是案例被标记为幻数,我不能使那些是最终的或类似的(我知道)。 我创建的程序得到一个随机数(int从0到199),并在开关中使用它,不仅如此,在ra.nextInt(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;
    }

您可以将这个列表具体化为一个文本文件,并让程序将文件内容读取到一个数组中。您可以将它放在代码中硬编码的位置,或者配置一个位置,或者您可以将它放在类路径(src/main/resources,如果您使用maven约定)中,并使用Class.getResourceAsStream读取它

将分类与名称存储在同一行,用分隔符分隔,如:

Sobras de Comida|O
Colcha Deshilachada|T
数组长度是传递到nextInt的值

将文件内容加载到数组中。去掉开关,使用随机值索引到数组中以获取字符串。然后可以拆分字符串并在返回的pojo上设置字段

采用这种方法:

  • 没有神奇的数字

  • 更新列表更容易

  • 您可以删除大量重复的低值代码


我尝试了所建议的答案,它成功了,以下是我最终得到的代码

public class DBAnalisis {


        private Random ra = new Random();

        private int ran = 0;

        private final int doscientos = 200;


    public Basura selectB(final Basura b) throws IOException {

        ran = ra.nextInt(doscientos);


        String linea;


        String[] basu = new String[2];


        BufferedReader dataBse = null;


        ArrayList<String> list = new ArrayList<String>();


        URL direcc = getClass().getResource("DB.txt");
        FileReader dB =
                new FileReader(direcc.getPath());

                try {

                    dataBse = new BufferedReader(dB);
                    // Lectura del fichero
                    while ((linea = dataBse.readLine()) != null) {
                        list.add(linea);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                dB.close();

                String[] myArray = new String[list.size()];
                list.toArray(myArray);


                //basu = myArray[ran].split("|", 1); no funciona

                 int index = myArray[ran].indexOf("|");
                 basu[0] = myArray[ran].substring(0, index);
                 basu[1] = myArray[ran].substring(index + 1);
                 basu[0].trim();
                 basu[1].trim();

                 b.setName(basu[0]);
                 b.setClasification(basu[1]);

                return b;


    }
}
公共类数据库{
私有随机ra=新随机();
私有int-ran=0;
私人最终int doscientos=200;
公共Basura selectB(最终Basura b)抛出IOException{
ran=ra.nextInt(doscientos);
弦线;
字符串[]basu=新字符串[2];
BufferedReader数据库=null;
ArrayList=新建ArrayList();
URL direcc=getClass().getResource(“DB.txt”);
文件读取器数据库=
新的文件读取器(direcc.getPath());
试一试{
数据库=新的BufferedReader(dB);
//费希罗讲座
而((linea=database.readLine())!=null){
列表。添加(linea);
}
}捕获(例外e){
e、 printStackTrace();
}
dB.close();
String[]myArray=新字符串[list.size()];
列表。toArray(myArray);
//basu=myArray[ran]。拆分(“|”,1);无函数a
int index=myArray[ran].indexOf(“|”);
basu[0]=myArray[ran]。子字符串(0,索引);
basu[1]=myArray[ran]。子字符串(索引+1);
basu[0].trim();
basu[1].trim();
b、 集合名(basu[0]);
b、 设定分类(basu[1]);
返回b;
}
}
DB.txt文件包含开关中的每个字符串 其划分如下:
NAME | CLASS

我已经读过这篇文章,但是没有多大帮助。如何解决案例x上的幻数错误?Edited提出了这个问题