我怎么能不使用参数在不同类的方法之间传递值

时间:2017-08-17 10:46:47

标签: java thread-local

通常,不同类之间的值传递是通过方法的参数完成的,例如,传递id值如下:

public class Controller {
    private Service service = new Service();
    void controllerMethod() {
        Integer id = 5;
        service.serviceMethod(id);
    }
    public static void main(String[] args) {
        Controller c = new Controller();
        c.controllerMethod();
    }
}

public class Service {
    private Dao dao = new Dao();
    void serviceMethod(Integer id) {
        dao.daoMethod(id);
    }
}

public class Dao {
    void daoMethod(Integer id) {
        System.out.println(id);
    }
}

这些方法调用实际上是在一个单独的线程中,所有这些都在“主”线程中。所以我想知道我是否可以将这个值存储在ThreadLocal中的'Controller'类中,然后从'Dao'类中的ThreadLocal中获取它,但是我失败了。

public class Controller {
    private Service service = new Service();

    void controllerMethod() {
        Integer id = 5;
        System.out.println(Thread.currentThread().getName());
        // ----add code
        ThreadLocal<Integer> local = new ThreadLocal<>();
        local.set(id);
        // ----
        service.serviceMethod();
    }

    public static void main(String[] args) {
        Controller c = new Controller();
        c.controllerMethod();
    }
}

public class Service {
    private Dao dao = new Dao();

    void serviceMethod() {
        System.out.println(Thread.currentThread().getName());
        dao.daoMethod();
    }
}

public class Dao {
    void daoMethod() {
        System.out.println(Thread.currentThread().getName());
        // ----add code
        ThreadLocal<Integer> local = new ThreadLocal<>();
        System.out.println(local.get());
        // ----
    }
}

结果:

我不知道为什么......这个方法可以用来实现没有参数的传递值吗?我希望有人可以帮助我。

  

PS:   有没有其他方法可以在多个类之间实现值的无参数传递?

4 个答案:

答案 0 :(得分:1)

你可以这样做::

class Test {
    public static void main(String[] args) {
        System.setProperty("id", "5");
        getId();
    }
    public static void getId() {
        System.out.println(System.getProperty("id"));
    }
}

您可以设置属性并可以从任何地方访问它。 这是最简单的方法。

答案 1 :(得分:0)

ThreadLocal通常用作静态变量:

public class Main {
    private static final ThreadLocal<Integer> CURRENT_ID = new ThreadLocal<>(1);

    private void method1() {
        CURRENT_ID.set(100);
        method2();
    }

    private void method2() {
        System.out.println("ID: " + CURRENT_ID.get());
    }
}

但对于常规应用程序代码,您几乎不需要直接使用ThreadLocal。即使它使编写代码更容易,也要记住测试!所以在你的情况下,我会考虑继续传递必要的变量作为参数。

如果您考虑通过ThreadLocal传递DAO或服务等依赖项,则应考虑dependency injection

如果方法参数太多,而不是通过ThreadLocal传递一些参数,请查看parameter objects

答案 2 :(得分:0)

您可以使用@Abhishek建议的Java-Solution系统类

System.setProperty("id", Integer.toString(5));

现在你可以使用getProperty(&#34; id&#34;)方法并读取另一个类中的id值。

  System.getProperty("id");

答案 3 :(得分:0)

ThreadLocal类为每个线程提供了自己的特定对象实例。它不是用于传递参数,当你有一些不是线程安全的对象但是你想避免同步对该对象的访问时使用它。 它取决于您的参数或变量的访问类型,如果它们在特定方法中是局部的并且它们不是常量,并且返回值或方法体的代码依赖于该变量,然后将其作为该方法的输入参数,但如果它在整个类上是全局的,那么使它成为一个类级变量,并使用getter和setter来访问它,如果类级别的变量在该类的所有实例之间共享,那么根据你的设计,场景和要求你也可以在构造函数或静态代码块中使它成为final或初始化变量。