【问题标题】:MVN Magic Number on switch开关上的 MVN 幻数
【发布时间】:2020-07-27 13:39:55
【问题描述】:

我和 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;
    }

【问题讨论】:

标签: java maven switch-statement checkstyle magic-numbers


【解决方案1】:

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

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

Sobras de Comida|O
Colcha Deshilachada|T

等等。数组长度是传递给 nextInt 的值。

文件的内容被加载到一个数组中。摆脱开关并使用随机值对数组进行索引以获取您的字符串。然后您可以拆分字符串并在要返回的 pojo 上设置字段。

采用这种方法:

  • 没有神奇的数字。

  • 更新列表更容易。

  • 可以删除一堆重复的低价值代码。

【讨论】:

    【解决方案2】:

    我尝试了建议的答案并且它有效,这是我最终得到的代码

    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;
    
    
        }
    }
    

    DB.txt 是包含交换机中每个字符串的文件 它的划分是这样的: 姓名|班级

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多