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

Pass a constructor argument to a static block

我有一个class这样的

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 字段为空。我不知道我做错了什么

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

如果该初始化依赖于实例特定参数(CustomRestClient 的不同实例可以接收不同的 dbStrings),则应将其移至实例方法(即不是 static ).

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

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();
}

并称它为:

CustomRestClient.login("db")

或者(没有静态)将方法移动到带有字符串参数的构造函数中

private String dbString;

public CustomRestClient(String db) {
    this.dbString = db;
    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();
    }

}

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

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

你可能想用一个单例实例替换你的静态东西(可能用一个静态方法来初始化它)---或者更好的是一个 "regular" 实例,然后你可以将它作为依赖注入到任何东西中代码需要使用您的 CustomRestClient(如果您需要使用多组连接设置,这会更容易)。