避免从高到低传递参数类
Avoid passing parameter from high to low-level classes
在我的 Java 网络服务器项目中,我的 Main.main
方法采用一个参数来指定它将在其中查找某些文件的目录,我稍后会用到这些文件。我的问题是,我实际上并没有在我的更高级别 classes 中对该参数做任何事情,但我的一些较低级别的人需要这些信息。
当然,解析和存储我的命令行参数的 class 是最先使用的参数之一,即我的最高级别之一 classes,所以我正在努力找到一种方法使我的低级 classes 可以访问命令行参数。
似乎我仅有的两个选择是要么一直向下传递它,通过 classes 除了将它传递到下一个级别之外从不触及参数,或者给它一个全局的范围。从设计的角度来看,这些似乎都不是很好的选择,所以我想知道是否有我遗漏的替代方案,或者我是否只需要选择两害相权取其轻——或者完全改变我的方式 classes 是结构化的。
是的,有很多选择:
- 如您所说,将它一直向下传递 - 可能,但不太好,因为绝对所有调用路径中的所有方法都必须将它作为参数。
使用系统属性代替main
方法参数和
一个。将您的 main 称为 >java -Dmy.path=path_to_directory
Main
b。使用环境变量
>set my.path=path_to_directory
>java Main
c。在 main
方法中设置:
public void main(String[] args) {
System.getProperties().put("my.path",args[dirPathIndex]);
在所有情况下,您都可以在代码中的任何位置获取值,就像:
String dirPath=System.getProperty("my.path");
创建一个小的局部静态"kind of cache"
在主要 class
public class Main{
public static String dirPath;
public void main(String[] args) {
dirPath= args[dirPathIndex];
此外,在代码中的任何位置,您都可以将其获取为:
`String dPath=Main.dirPath;`
当然围绕"local cache"方法还有更多选择,但主要思想仍然相同。在某处保留一个值,您可以在代码中的任何位置获取它。
你避免通过 类 传递一些不需要它们的参数是正确的。这样做的诀窍是低级对象,如果设计得当,仍然是在高层构造的,这意味着您通常会在应用程序顶部的某个地方传递所需的参数。
具有两个级别的示例。而不是这样做:
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) 做事方式,它可以解决您的问题。
在我的 Java 网络服务器项目中,我的 Main.main
方法采用一个参数来指定它将在其中查找某些文件的目录,我稍后会用到这些文件。我的问题是,我实际上并没有在我的更高级别 classes 中对该参数做任何事情,但我的一些较低级别的人需要这些信息。
当然,解析和存储我的命令行参数的 class 是最先使用的参数之一,即我的最高级别之一 classes,所以我正在努力找到一种方法使我的低级 classes 可以访问命令行参数。
似乎我仅有的两个选择是要么一直向下传递它,通过 classes 除了将它传递到下一个级别之外从不触及参数,或者给它一个全局的范围。从设计的角度来看,这些似乎都不是很好的选择,所以我想知道是否有我遗漏的替代方案,或者我是否只需要选择两害相权取其轻——或者完全改变我的方式 classes 是结构化的。
是的,有很多选择:
- 如您所说,将它一直向下传递 - 可能,但不太好,因为绝对所有调用路径中的所有方法都必须将它作为参数。
使用系统属性代替
main
方法参数和一个。将您的 main 称为
>java -Dmy.path=path_to_directory
Mainb。使用环境变量
>set my.path=path_to_directory
>java Main
c。在
main
方法中设置:public void main(String[] args) {
System.getProperties().put("my.path",args[dirPathIndex]);
在所有情况下,您都可以在代码中的任何位置获取值,就像:
String dirPath=System.getProperty("my.path");
创建一个小的局部静态"kind of cache" 在主要 class
public class Main{
public static String dirPath;
public void main(String[] args) {
dirPath= args[dirPathIndex];
此外,在代码中的任何位置,您都可以将其获取为:
`String dPath=Main.dirPath;`
当然围绕"local cache"方法还有更多选择,但主要思想仍然相同。在某处保留一个值,您可以在代码中的任何位置获取它。
你避免通过 类 传递一些不需要它们的参数是正确的。这样做的诀窍是低级对象,如果设计得当,仍然是在高层构造的,这意味着您通常会在应用程序顶部的某个地方传递所需的参数。
具有两个级别的示例。而不是这样做:
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) 做事方式,它可以解决您的问题。