在我的Java Web服务器项目中,我的Main.main
方法接受一个参数,指定它将查找某些文件的目录,我稍后会使用它。我的问题是我实际上并没有在我的更高级别的课程中对该论点做任何事情,但是我的一些较低级别的课程需要这些信息。
当然,解析和存储我的命令行参数的类是最先使用的类之一,也就是我最高级别的类之一,所以我很难找到一种方法来使命令行参数可以访问我的低级班。
似乎我唯一的两个选择是将它一直传递下去,通过从不接触参数的类,而不是将它传递到下一级,或者给它一个全局范围。从设计的角度来看,这些都不是很好的选择,所以我想知道是否有一个我缺少的替代方案,或者我是否只需要选择两个小恶魔中的一个 - 或者完全改变我的类的结构方式
答案 0 :(得分:1)
你应该避免通过不需要它们的课程传递一些论点。这样做的诀窍是,低级对象在正确设计时仍然构造在高级别,这意味着您通常会在应用程序顶部的某处传递所需的参数。
两个级别的示例。而不是这样做:
public class ObjectA {
public ObjectA(String path) {
....
b = new ObjectB(path);
}
}
public class ObjectB {
public ObjectB(String path) {
...
}
}
public static void main(String[] args) {
...
new ObjectA(path);
}
您将path
传递给ObjectA
只是因为它需要使用该参数构造ObjectB
,您可以这样做:
public class ObjectA {
public ObjectA(ObjectB b) {
....
}
}
public class ObjectB {
public ObjectB(String path) {
...
}
}
public static void main(String[] args) {
...
new ObjectA(new ObjectB(path));
}
这是为了避免传播依赖,并且通常是依赖注入的一部分。 DI有着不同的声誉,因为它被Spring和JEE等容器所吸引,但其核心DI实际上只意味着你不应该在其他对象中实例化对象,而不是已经配置好的对象对象应该传递给其他对象。这有效地将对象构造和配置与使用它的对象分离。
首先以这种方式构建应用程序可能听起来很奇怪,它对设计有各种奇怪的后果,但它是正确的(OO)方式来做事情并且它解决了你的问题。
答案 1 :(得分:0)
是的,有很多选择可以做到这一点:
使用系统属性而不是main
方法参数和
一个。将您的主电话称为>java -Dmy.path=path_to_directory
主要
湾使用环境变量
>set my.path=path_to_directory
>java Main
℃。在main
方法中设置它:
public void main(String[] args) {
System.getProperties().put("my.path",args[dirPathIndex]);
在所有情况下,您都可以在代码中的任何位置获取值:
String dirPath=System.getProperty("my.path");
创建一个小的本地静态“缓存” 在主类
public class Main{
public static String dirPath;
public void main(String[] args) {
dirPath= args[dirPathIndex];
然后,代码中的任何地方都可以将其作为:
`String dPath=Main.dirPath;`
当然,围绕“本地缓存”方法有更多选择,但主要思想仍然相同。在某处保留一个值,您可以在代码中的任何位置获取它。