3

我正在做一个项目,我需要从命令行传递多个参数-

以下是我的用例-

  1. 从命令行,我将传递至少四个参数noOfThreads- ,和noOfTasks,所以如果我传递这四个东西,那么我需要将它们存储在一个变量中,对于任何表名 - 我需要将它添加到字符串列表中这样我就可以在我的其他代码中使用它们。startRangetableName1

  2. 其次,我可以传递五个参数而不是像上面那样传递四个 - 所以五个参数可以是- noOfThreadsnoOfTasksstartRange和。所以这里是额外的。因此,如果我要传递这五个东西,那么我需要将它们存储在一个变量中,在这里我将作为两个表传递,所以我会将这两个表存储在一个字符串列表中。tableName1tableName2tableName2tableName1tableName2

  3. 第三,我可以传递六个参数而不是像上面那样传递五个 - 所以六个参数可以是- noOfThreadsnoOfTasksstartRangetableName1和。所以这里是额外的。所以如果我传递这六个东西,那么我需要将它们存储在一个变量中,在这里我传递,作为三个表,所以我将再次将这三个表存储在一个字符串列表中。tableName2tableName3tableName3tableName1tableName2tableName3

因此,对于上述情况,我有以下代码。它目前看起来非常难看,因为我的代码中有很多重复,如下所述。有什么办法可以让它更干净吗?

下面是我的代码-

private static List<String> databaseNames = new ArrayList<String>();
private static int noOfThreads;
private static int noOfTasks;
private static int startRange;
private static String tableName1;
private static String tableName2;
private static String tableName3;

public static void main(String[] args) {

if (args.length > 0 && args.length < 5) {

    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    databaseNames.add(tableName1);
} else if (args.length > 0 && args.length < 6) {
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    tableName2 = args[4];
    databaseNames.add(tableName1);
    databaseNames.add(tableName2);
} else {
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    tableName1 = args[3];
    tableName2 = args[4];
    tableName3 = args[5];
    databaseNames.add(tableName1);
    databaseNames.add(tableName2);
    databaseNames.add(tableName3);
}
}
4

2 回答 2

2

您有很多冗余,当您看到这些时,请考虑使用简化方法进行重构。这实际上就是我要做的。此外,请考虑为您的 tableNames 设置 String[] 字段,String[] tableNames一旦您知道参数计数,您就可以将其声明为所需大小的数组。例如:

public void fillParams(String[] args) {
    if (args.length < someMinimum) {
       // throw some exception
    }
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);

    tableNames = new String[args.length - 3];
    for (int i = 0; i < tableNames.length; i++) {
       tableNames[i] = args[i + 3];
       databaseNames.add(tableNames[i]);
    }
}
于 2013-02-10T05:58:08.503 回答
0

我建议删除 tableName1 - tableName3,它们是多余的,你总是可以得到一个表名

tablename1 =  databaseNames.get(0);

这是我的版本:

public static void main(String[] args) {
    if (args.length < 4) {
        System.err.println("Usage: ....");
        System.exit(1);
    }
    noOfThreads = Integer.parseInt(args[0]);
    noOfTasks = Integer.parseInt(args[1]);
    startRange = Integer.parseInt(args[2]);
    for(int i = 3; i < args.length; i++) {
        databaseNames.add(args[i]);
    }
}
于 2013-02-10T06:14:21.467 回答