我有一个这样的课程
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
字段为空。我不知道我在做什么错
答案 0 :(得分:2)
const { error } = this.state;
<div className="col-8" style={{color:error}}>Please enter valid data</div>
对象之前先执行
您应将静态块移至静态方法并调用
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
(如果您需要使用多组连接设置,这将变得更加容易)。