Java中对静态只读变量的初始化
2009-04-11 22:22
在几乎所有的编程语言里,都能看到只读变量的应用。就来BASH、KSH这样的脚本语言,都有只读变量。
在程序运行期间已知的、一成不变的资源、信息,我们都可以使用静态只读的变量来保存它。
在Java中,对只读变量的初始化也很灵活。我们可以使用传统的初始化方法,在声明后紧跟着值。比如:
public class A {
public static final String RESOURCE_A = "aaa.png";
......
}
另外,对于数组型的变量,我们可以使用大括号来括住要初始化的所有值:
......
public static final String[] RESOURCES = {"aaa.png","bbb.png","aaa.txt"};
......
对于其它类型的数据,如List、Map以及其它一些类的对象的初始化,就不是这样简单地使用等号“=”来完成的了。
在java中,我们可以在类中使用static{...}来执行类中静态成员的初始化,这里面的代码会最先被执行到。因此,就可以在static{...}中对静态只读的变量进行初始化了:
......
public static final String RES_A = "aaa.png";
public static final String RES_B = "bbb.png";
......
public static final Map<String, String> RES_MAP = new HashMap<String, String>();
......
static {
RES_MAP.put("res_a", RES_A);
RES_MAP.put("res_b", RES_B);
......
}
......
至于非静态的只读变量(不使用static,只用final声明的变量……貌似用的情况比较少),就可以直接在类的构造函数中执行初始化。这样的话,在类的对象出生之前,这个只读变量就是未知的,但是对象一但生成,就不能再改变它的值了。
因为Java中这种“只读”变量似乎还是可变的,所以 .NET 设计者将真正“只读”的和Java中的这种“只读”做了区分,分别以const和readonly关键字来指代。
下面,我给出一个可以直接运行的,非常简单的例子,来说明一下java中对只读变量的初始化:
public class Hello {
public static final String CLASS_FINAL;
public final String OBJ_FINAL;
public Hello() {
OBJ_FINAL = "non-static final String.";
}
static {
CLASS_FINAL = "static String for class.";
}
public static void main(String[] args){
Hello h = new Hello();
System.out.println("Hello! " + h.OBJ_FINAL);
System.out.println("Hello! " + CLASS_FINAL);
}
}
在程序运行期间已知的、一成不变的资源、信息,我们都可以使用静态只读的变量来保存它。
在Java中,对只读变量的初始化也很灵活。我们可以使用传统的初始化方法,在声明后紧跟着值。比如:
public class A {
public static final String RESOURCE_A = "aaa.png";
......
}
另外,对于数组型的变量,我们可以使用大括号来括住要初始化的所有值:
......
public static final String[] RESOURCES = {"aaa.png","bbb.png","aaa.txt"};
......
对于其它类型的数据,如List、Map以及其它一些类的对象的初始化,就不是这样简单地使用等号“=”来完成的了。
在java中,我们可以在类中使用static{...}来执行类中静态成员的初始化,这里面的代码会最先被执行到。因此,就可以在static{...}中对静态只读的变量进行初始化了:
......
public static final String RES_A = "aaa.png";
public static final String RES_B = "bbb.png";
......
public static final Map<String, String> RES_MAP = new HashMap<String, String>();
......
static {
RES_MAP.put("res_a", RES_A);
RES_MAP.put("res_b", RES_B);
......
}
......
至于非静态的只读变量(不使用static,只用final声明的变量……貌似用的情况比较少),就可以直接在类的构造函数中执行初始化。这样的话,在类的对象出生之前,这个只读变量就是未知的,但是对象一但生成,就不能再改变它的值了。
因为Java中这种“只读”变量似乎还是可变的,所以 .NET 设计者将真正“只读”的和Java中的这种“只读”做了区分,分别以const和readonly关键字来指代。
下面,我给出一个可以直接运行的,非常简单的例子,来说明一下java中对只读变量的初始化:
public class Hello {
public static final String CLASS_FINAL;
public final String OBJ_FINAL;
public Hello() {
OBJ_FINAL = "non-static final String.";
}
static {
CLASS_FINAL = "static String for class.";
}
public static void main(String[] args){
Hello h = new Hello();
System.out.println("Hello! " + h.OBJ_FINAL);
System.out.println("Hello! " + CLASS_FINAL);
}
}