我正在尝试使用相同的jar文件(如果可能)实现以下目标:
我非常清楚我可以检查args
数组的长度,但是,我还没有看到满足上述两个条件的方法。
因此,简单的args.length > 0
检查无法满足上述第一个要求。
有没有办法实现所描述的行为,我可能需要寻找父流程,还是这样的事情根本不可行/不可能?
答案 0 :(得分:4)
public static void main(String[] args) {
if (args.length > 0) {
//use as command line tool
} else {
//start GUI
}
}
你只需要检查是否有命令行参数。
答案 1 :(得分:0)
OOP,Architechture,SOLID Principles等等......
在SOLID原则中,第一个原则是Single Responsibility Principle
,其中必须将自己对象中的每个责任分开,每个对象只有一个责任。因此,例如,不能将应用程序逻辑放在同一个UI对象中。
您的解决方案是将应用程序逻辑与UI分开,然后创建另一个作为命令行界面的界面。
例如:你想制作一些可以添加两个数字的东西。
一个人JFrame
,两个JTextField
和一个按钮。然后你添加
按钮上的单击侦听器,添加两个数字并将其打印在JLabel上。但是,如果它是这样的,那怎么能做一个CLI?
在这种情况下,您应该制作类似的东西,它处理Swing和CLI(应用程序逻辑)之间的通用逻辑:
interface NumberAdditionResultAsString {
void postResult(String result);
void postError(Exception ex);
}
class NumberAdderFromStrings {
void executeTheAddition(String num1, String num2, NumberAdditionResultAsString listener) {
try {
double n1 = Double.parseDouble(num1);
double n2 = Double.parseDouble(num2);
listener.postResult(Double.toString(n1 + n2));
} catch(Exception ex) {
listener.postError(ex);
}
}
}
现在可以轻松地从Swing和CLI调用此应用程序逻辑。 还使用了“回调”,它更适合处理在其他线程上发生的冗长操作。
此外,如果您想要更复杂的东西,可以使用command
设计模式。所有那些“应用程序逻辑”,实现单个接口。然后你的UI和CLI都会调用它们。
interface ApplicationCommand {
Object execute(Object... parameters);
}
然后在主要的Application类中创建类似的东西:
Map<String, ApplicationCommand> commandMap = new HashMap<>();
然后填充它:
commandMap.put("add", new ApplicationCommand() {
@Override
public Object execute(Object... parameters) {
double sum = 0;
for (Object one: parameters) {
sum += Double.parseDouble(one.toString());
}
return sum;
}
});
嗯,这不是最好的设计。更好的方法是将每个String与创建命令的Factory对象相关联,而不是与命令对象本身相关联。但这是为了简单起见。
建议:了解
Abstract factory design pattern
Flyweight design pattern(可以帮助正确创建命令图)
SOLID Principles(主要阅读:单一责任和依赖性倒置)