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)
注意事项-
我以某种方式尝试编写一个接口,但未成功。我不确定这是否是一个好方法。我需要一些设计准则。
这是我写的代码-
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)
我认为这种编写代码的问题是-
谢谢 !
小智 5
我会向您推荐JCommander。
我认为这是Java的一个很好的Argument Parser。
您可以在批注中定义所有Argument内容,然后调用JCommander对其进行解析。最重要的是,它(基于您的注释)还可以打印出相应的帮助页面。您不必担心任何事情。
相信您一定会喜欢的!:)
看看它:http : //jcommander.org/ 有很多例子!
祝好运!:)
| 归档时间: |
|
| 查看次数: |
3311 次 |
| 最近记录: |