嗨,我有一个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的值。我在做什么错,我该怎么办?
答案 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_URL
和AUTHENTICATE_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_AD
和BASE_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";
}