java - 在 Java 中解析命令行参数的代码结构

标签 java command-line-arguments

我有一个关于代码结构的问题。

我已经让我们说了三种类型的包 A、B 和 C。

现在,包 A 中的类包含包含 main() 函数的类。这些类 需要一些命令行参数才能运行。

在包B中,有一些类,其中包含一些公共(public)变量,需要在不同的时间进行配置。例如在调用函数A之前,变量应该被设置或重置,输出根据这个变量而不同。

在C包中,使用B包中的类来完成一些任务。他们确实如前所述配置了变量。不仅在创建对象时,而且在中间阶段。

包 A 也有类,这些类又使用包 B 和包 C 的类。为了配置 B 和 C 类中的变量,包 A 中的类包含 main() 函数,读取命令行参数并传递相应类别的正确值。

现在,鉴于这种情况,我想使用 Apache Commons CLI解析器。

我无法理解我应该如何以优雅的方式编写我的代码。对于这种情况,什么是好的设计实践。

最初我编写了一个没有 Apache 的类来解析命令行参数。

由于我想就设计问题提出建议,所以我将给出代码摘录而不是完整代码。

public class ProcessArgs 
{
     private String optionA= "default";
     private String optionB= "default";
     private String optionC= "default";

     public void printHelp ()
     {
         System.out.println ("FLAG : DESCRIPTION : DEFAULT VALUE");
         System.out.println ("-A <Option A> : Enable Option A : " + optionA);
         System.out.println ("-B <Option B> : Enable Option B : " + optionB);
         System.out.println ("-C <Option C> : Enable Option C : " + optionC); 
     }

     public void printConfig()
     {
         System.out.println ("Option A " + optionA);
         System.out.println ("Option B " + optionB);
         System.out.println ("Option C " + optionC);
     }

     public void parseArgs (String[] args)
     {
        for (int i=0;i<args.length;i++)
        {
        if (args[i].equalsIgnoreCase ("-A"))
           optionA = args[++i];
        else if (args[i].equalsIgnoreCase ("-B"))
           optionB = args[++i];
        else if (args[i].equalsIgnoreCase ("-C"))
           optionC = args[++i];
        else
           throw new RuntimeException ("Wrong Argument : " + args[i] + " :: -h for Help.");
    }
     }
}

注意事项-

  • 我已经有 50 多个命令行选项,而且它们都在一个地方。
  • 每个类只使用一组命令行选项。

我尝试编写一个界面,但不知何故我没有成功。我不确定这是否是一个好方法。我需要一些设计指南。

这是我写的代码-

public interface ClassOptions 
{
    Options getClassOptions();
    void setClassOptions(Options options);
}

public class Aclass implements ClassOptions
{
    private String optionA="defaultA";
    private String optionB="defaultB";

    public Options getClassOptions()
    {
        Options options = new Options();    

        options.addOption("A", true, "Enable Option A");
        options.addOption("B", true, "Enable Option B");        

        return options;
    }

    public void setClassOptions(Options options, String args[])
    {
        CommandLineParser parser = new BasicParser();
        CommandLine cmd=null;
        try 
        {
            cmd = parser.parse( options, args);
        } catch (ParseException e) 
        {
            // TODO Auto-generated catch block
            // e.printStackTrace();
            System.out.println("ignored option");
        }

        if(cmd.hasOption("A"))
            optionA = "enabled";

        if(cmd.hasOption("B"))
            optionB = "enabled";    
    }
}

我认为这样写代码的问题是——

  • 有不同类型的参数,如 int、double、string、boolean。如何处理它们。
  • getClassOption() 和 setClassOption() 都包含例如参数“A”、“B”。此代码在编写代码时容易出错,我想消除这些错误。
  • 我认为这里的代码越来越重复,可以以某种方式封装在另一个类中。
  • 并非所有参数都是必需的,但可以忽略。

谢谢!

最佳答案

我会向您推荐 JCommander。

我认为它是一个非常好的 Java 参数解析器。

您在注释中定义所有 Argument 内容,然后调用 JCommander 来解析它。 除此之外,它还(根据您的注释)可以打印出相应的帮助页面。 您无需关心任何事情。

相信你会喜欢的! :)

看一看:http://jcommander.org/ 有很多这样的例子!

祝你好运! :)

关于java - 在 Java 中解析命令行参数的代码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20571432/

相关文章:

java - 如何使用 java-streams 从列表创建 map ?

java - 使用 Hibernate 从 CSV 文件更新 Oracle DB 数据

c - 为什么在 C 中将 argv(参数 vector )定义为指针,以及将其第零定义为程序名称的需要是什么?

c - c 中的命令行参数和 scanf 函数有什么区别?

c++ - 使用/Command 选项从命令行为 visual studio C++ 项目创建一个新文件

python子进程缺少参数

java - 从 1.6 升级到 Java 1.7 引入的 SSL 错误

java - 将 XML 粘贴到我的 IDE 中并对其进行格式化

java - 如何根据对象的内容对 ArrayList 进行排序

c - C 中从命令行输入的字符串或字符