将构造函数参数传递给静态块

时间:2018-11-22 11:11:21

标签: java constructor static static-block

我有一个这样的课程

public class CustomRestClient {

private static String dbString;

public CustomRestClient(String db) {
    this.dbString = db;
}

static {       
    try {
        Client.setServer(Client.Server.LOCAL);
        AuthenticationProvider provider = new AuthenticationProvider();
        provider.setCredentialsProvider(new SimpleCredentialsProvider("user", "pass", dbString, "secretkey"));
        Client.setAuthenticationProvider(provider);
        Client.login();
    } catch (ClientException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    CustomRestClient customRestClient = new CustomRestClient("db");
 }
}

我正在尝试在静态块内传递构造函数参数

provider.setCredentialsProvider(new SimpleCredentialsProvider("user", "pass", dbString, "secretkey"));

例如,CustomRestClient customRestClient = new CustomRestClient("db");应将静态块内的dbString字段设置为db。但是,当我运行程序时,它说dbString字段为空。我不知道我在做什么错

3 个答案:

答案 0 :(得分:2)

在创建const { error } = this.state; <div className="col-8" style={{color:error}}>Please enter valid data</div> 对象之前先执行

static block

您应将静态块移至静态方法并调用

CustomRestClient

并命名为:

public static void login(String db) {
        Client.setServer(Client.Server.LOCAL);
        AuthenticationProvider provider = new AuthenticationProvider();
        provider.setCredentialsProvider(new SimpleCredentialsProvider("user", "pass", dbString, "secretkey"));
        Client.setAuthenticationProvider(provider);
        Client.login();
}

或者(不带静态)在带有String参数的构造函数内部移动方法

CustomRestClient.login("db")

}

答案 1 :(得分:1)

将代码块放在静态初始化程序块中是错误的,因为它取决于构造函数参数,该参数在执行静态块后传递给构造函数。

如果该初始化取决于实例特定的参数(this.$route.params.ID的不同实例可以接收不同的CustomRestClient),则应将其移至实例方法(即不是dbString)。

另一方面,如果static应该保留为dbString变量,则应使用某些static方法而不是构造函数对其进行初始化。在这种情况下,您的static初始化程序块应移至该static方法。执行该static方法是您的责任。

答案 2 :(得分:1)

这不起作用,因为static块在创建任何实例或构造函数之前在类初始化期间运行。

并且无法将参数传递给它。它唯一能做的就是从您首先设置的另一个位置加载静态值。从外部配置(系统属性等)读取也是一种选择。

您可能想用单例实例替换静态对象(也许可以使用静态方法对其进行初始化)-甚至更好的是“常规”实例,然后可以将其作为依赖项注入到需要使用的任何代码中您的CustomRestClient(如果您需要使用多组连接设置,这将变得更加容易)。