避免从高到低传递参数类

Avoid passing parameter from high to low-level classes

在我的 Java 网络服务器项目中,我的 Main.main 方法采用一个参数来指定它将在其中查找某些文件的目录,我稍后会用到这些文件。我的问题是,我实际上并没有在我的更高级别 classes 中对该参数做任何事情,但我的一些较低级别的人需要这些信息。

当然,解析和存储我的命令行参数的 class 是最先使用的参数之一,即我的最高级别之一 classes,所以我正在努力找到一种方法使我的低级 classes 可以访问命令行参数。

似乎我仅有的两个选择是要么一直向下传递它,通过 classes 除了将它传递到下一个级别之外从不触及参数,或者给它一个全局的范围。从设计的角度来看,这些似乎都不是很好的选择,所以我想知道是否有我遗漏的替代方案,或者我是否只需要选择两害相权取其轻——或者完全改变我的方式 classes 是结构化的。

是的,有很多选择:

  1. 如您所说,将它一直向下传递 - 可能,但不太好,因为绝对所有调用路径中的所有方法都必须将它作为参数。
  2. 使用系统属性代替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");

  3. 创建一个小的局部静态"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) 做事方式,它可以解决您的问题。