对于android中的应用程序 我有一个全局变量,
public class ConstantsUrls {
public static String GET_CART_ALL_ITEM = "store/3/cart/" + CartFunctions.ReturnUserRrQuote() + "/type/customer"
}
并且有,
public class CartFunctions {
public static String ReturnUserRrQuote() {
String user_value = "";
//some function
return user_value;
}
}
当我调用一个函数时,让A带参数ConstantsUrls.GET_CART_ALL_ITEM
为
A(ConstantsUrls.GET_CART_ALL_ITEM);
我得到的正确值为store/3/cart/100/type/customer
,但是当我再次打电话时
具有相同参数的函数A我总是得到与store/3/cart/100/type/customer
完全相同的值,即使ReturnUserRrQuote()
没有调用第二次获取更新值。
当我调用函数
时 A("store/3/cart/" + CartFunctions.ReturnUserRrQuote() + "/type/customer")
而不是
A(ConstantsUrls.GET_CART_ALL_ITEM);
我总能得到正确的工作(更新的正确值)
为什么全局变量不会在同一个全局变量中使用全局函数进行更新。 这个Java核心的行为是这样的还是其他任何原因?
答案 0 :(得分:1)
在您的代码中,创建常量GET_CART_ALL_ITEM并仅初始化一次,它采用当前值ReturnUserRrQuote()
。稍后它不会触发该函数,因为常量已经具有其值并且不需要新的初始化。
如果在代码的开头ReturnUserRrQuote()
=> " 100&#34 ;.然后创建GET_CART_ALL_ITEM并使用此值进行初始化,它将是"store/3/cart/100/type/customer"
而不是"store/3/cart/" + ReturnUserRrQuote() + "/type/customer"
。它在初始化时的正当原因是评估表达式"store/3/cart/" + ReturnUserRrQuote() + "/type/customer"
并且结果受常量影响(表达式不受常量影响)。
因此,当您稍后调用此常量时,假设为ReturnUserRrQuote()
=> " 250&#34 ;. GET_CART_ALL_ITEM仍为"store/3/cart/100/type/customer"
。您还没有重新定义它以包含ReturnUserRrQuote()
的新值(并且您不希望java这样做或者它不会成为常量)。
在你的情况下,要么你想要一个常数,所以只要ReturnUserRrQuote()
发生变化就不会改变它是正常的。或者你希望它每次重新评估,你不想要一个常数。你可以这样做:
public static final const1 = "store/3/cart/";
public static final const2 = "/type/customer";
//whenever you have to obtain your value
String value = const1 + ReturnUserRrQuote() + const2;
修改强> 你说的是全局变量而不是常数,但问题是一样的。即使是非全局变量。
//Static function that return the number of times it has been called
public static returnNumber() {
final int i=1;
return i++;
}
public static void main() {
int a = returnNumber(); //Initialize a
for (j=0; j<10; j++) {
System.out.println(a); //print the current value of a
}
}
在这个例子中,a将在main的开头初始化。将评估表达式returnNumber()
,结果将受到影响。这是第一次调用returnNumber
,然后结果为1.因此a的值为1而不是returnNumber()
。在循环中,我调用了10次,然后打印出来。 10次a将值1,数字1将打印10次。每次拨打电话时都不会拨打returnNumber()
。