【问题标题】:Is there a way in Java to set a value of a variable in one class and be able to access from another oneJava中有没有办法在一个类中设置变量的值并能够从另一个类中访问
【发布时间】:2021-05-09 13:08:36
【问题描述】:

假设我有一个RestController,并且在我的 post 方法中,我想设置全局或某物的值,这样我就可以在更远的另一个类中访问它,而不必将它传递给方法:

假设我有:

RestController 类

public void postMethod() {
    int x = 10;
    serviceMethod(x);
}

服务类

public void serviceMethod(int x) {
    componentMethod(x);
}

助手类

public void componentMethod(int x) {
    if(x==10) {
        log.info("YES");
    }
}

是否可以以某种方式直接访问x 的值,而不是将其传递给每个方法?

【问题讨论】:

  • 如果该值仅适用于当前请求的持续时间,那么您可以将该值存储在 ThreadLocal 中。
  • 我不确定你为什么需要它,但如上所述你将它存储在 ThreadLocal 中,但只有在你确定整个流程在同一个线程中执行的情况下
  • 我需要它,因为我不想一直将变量传递给每个方法。我需要变量的方法在调用的后面。所以当我在控制器中设置它时,我不想继续做 service.a(x) -> component.b(x) -> helper.a(x) -> Helper { a(x) { if(x ) { log.info("YES") } } }

标签: java spring-boot spring-restcontroller


【解决方案1】:

是的,这是可能的。您可以在全局范围内定义变量并在另一个类中创建该类的实例。并且使用该实例,您可以访问另一个类中的变量。

例如。

class RestController {
    int x = 10;
}

class Service {
    RestController rs = new RestController();
    int x = rs.x;
    componentMethod(x);
}

但如果您的整个操作/程序都在同一个线程中执行,那么请考虑使用ThreadLocal。将值存储在ThreadLocal 中,您可以在同一个线程中使用它。

【讨论】:

  • 是的,也就是说你已经知道了这个值,并且它在系统运行之前被初始化。我需要在控制器被击中时设置它,在那里初始化变量,然后稍后使用。
  • 您可以通过定义某些条件来初始化控制器。但在这种情况下,流程也将与我上面回答的相同。如果这个答案不是您想要的,那么请详细说明您的用例。
【解决方案2】:

使用ThreadLocal,但请注意ThreadLocal只有在您确定程序流程在同一个线程中执行时才应使用,这就是他们称之为ThreadLocal的原因。

给您的提示是,当您使用 ThreadLocal 时,切勿在其上编写包装器,因为团队中每个想要使用该变量的开发人员都必须知道它是 ThreadLocal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 2017-03-22
    • 2020-09-02
    • 2023-04-07
    相关资源
    最近更新 更多