为什么常量类的静态变量不连接其他类的值?

时间:2018-12-07 08:32:30

标签: java android

嗨,我有一个Constant类,其中有一个基本URL

public static String BASE_URL = "";

我正在从我的登录活动中分配该值

URLsAndConstants.BASE_URL += enterUrlEditText.getText().toString();

然后我再次在Constant班上这样做

public  static String AUTHENTICATE_USER_BY_AD = BASE_URL + "/MyApi";

虽然我可以在分配后记录BASE_URL的值,但不能将其附加到其他静态字符串,即 当我使用这个public static String AUTHENTICATE_USER_BY_AD 在API中,它不会连接BASE_URL的值。我在做什么错,我该怎么办?

4 个答案:

答案 0 :(得分:1)

通常在加载类时立即为静态常数分配值。

换句话说:常量类被加载,而BASE_URL得到“”。

下一步,将根据静态字段的 current 值向AUTHENTICATE_USER_BY_AD分配该表达式"" + ...;的结果。

以后重新分配BASE_URL的事实并不会导致AUTHENTICATE_USER_BY_AD被“重新计算”。那个坚持最初的价值!

此处的“真实”答案:请勿使用此类静态字段。如果可以的话,您可以创建一个方法

String getAuthenticatedUserUrl() {
  return BASE_URL + "/MyApi";
}

然后调用该方法。但是正如所说的那样:在事实之后,更新这个静态字段 已经是一个坏主意。例如,一旦您有多个线程,并以不同的方式设置该字段,该操作就会完全中断!

real 解决方案可能是拥有“某种” Url类。创建该类的实例时,请为该单个实例定义baseUrl

答案 1 :(得分:1)

从您的代码段中,一旦常量类被加载(在登录活动之前),就会对BASE_URLAUTHENTICATE_USER_BY_AD进行评估。 您在活动中对BASE_URL所做的任何进一步更改都不会更改AUTHENTICATE_USER_BY_AD的值。

答案 2 :(得分:1)

问题是您什么都不做:

该行:

public static String AUTHENTICATE_USER_BY_AD = BASE_URL + "/MyApi";

仅在加载您的应用并使用当时AUTHENTICATE_USER_BY_AD中的值初始化BASE_URL时调用一次。

它不会在AUTHENTICATE_USER_BY_ADBASE_URL变量之间创建任何链接。

您将需要添加代码以同时更新两个变量。

这就是为什么不建议在类中使用公共成员,而是使用getters and setters

这也适用于任何非final(恒定)静态成员。

对于您而言,您想创建一个public static setBaseUrl(String url)函数,该函数将进行与更新应用程序基本URL有关的所有更改,并将BASE_URL设置为私有。

答案 3 :(得分:1)

问题出在

中的static关键字中
public  static String AUTHENTICATE_USER_BY_AD = BASE_URL + "/MyApi";

它是static,它是在同时与

一起首次加载的
public static String BASE_URL = "";

这意味着无论您如何更改 BASE_URL AUTHENTICATE_USER_BY_AD 都不会受到影响。

对于您来说,static方法可能是一种解决方案:

public static String getApiURL() {

    return AUTHENTICATE_USER_BY_AD = BASE_URL + "/MyApi";
}