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

Raj*_*Raj 4 java command-line-arguments

我对代码的结构有疑问。

我已经说了三种类型的软件包A,B和C。

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

在程序包B中,有一些类,其中包含一些需要在不同时间配置的公共变量。例如,在调用函数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.");
    }
     }
}
Run Code Online (Sandbox Code Playgroud)

注意事项-

  • 我已经有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";    
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这种编写代码的问题是-

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

谢谢 !

小智 5

我会向您推荐JCommander。

我认为这是Java的一个很好的Argument Parser。

您可以在批注中定义所有Argument内容,然后调用JCommander对其进行解析。最重要的是,它(基于您的注释)还可以打印出相应的帮助页面。您不必担心任何事情。

相信您一定会喜欢的!:)

看看它:http : //jcommander.org/ 有很多例子!

祝好运!:)