这个例子是 java 编程思想——17.2.3 小节.使用 abstract 类。这个例子作者就是想,体现一下“享元”设计模式,大概意思就是容器的数据不一定非得存在容器内部。
package net.mindview.util;
import java.util.*;//删掉所有 import,改成*
public class Countries {
public static final String[][] DATA = new String[][]{{"ALGERIA", "Algiers"}, {"ANGOLA", "Luanda"}, {"BENIN", "Porto-Novo"}, {"BOTSWANA", "Gaberone"}, {"BURKINA FASO", "Ouagadougou"}, {"BURUNDI", "Bujumbura"}};//删掉了一些
static Map<String, String> map = new Countries.FlyweightMap((Countries.FlyweightMap)null);//这句不懂?
static List<String> names;
static {
names = new ArrayList(map.keySet());
}
public Countries() {
}
static Map<String, String> select(final int size) {
return new Countries.FlyweightMap() {
public Set<java.util.Map.Entry<String, String>> entrySet() {
return new Countries.FlyweightMap.EntrySet(size);
}
};
}
public static Map<String, String> capitals() {
return map;
}
public static Map<String, String> capitals(int size) {
return select(size);
}
public static List<String> names() {
return names;
}
public static List<String> names(int size) {
return new ArrayList(select(size).keySet());
}
public static void main(String[] args) {
Print.print(capitals(10));
Print.print(names(10));
Print.print(new HashMap(capitals(3)));
Print.print(new LinkedHashMap(capitals(3)));
Print.print(new TreeMap(capitals(3)));
Print.print(new Hashtable(capitals(3)));
Print.print(new HashSet(names(6)));
Print.print(new LinkedHashSet(names(6)));
Print.print(new TreeSet(names(6)));
Print.print(new ArrayList(names(6)));
Print.print(new LinkedList(names(6)));
Print.print(capitals().get("BRAZIL"));
}
//就是个静态内部类
private static class FlyweightMap extends AbstractMap<String, String> {
private static Set<java.util.Map.Entry<String, String>> entries;
static {
entries = new Countries.FlyweightMap.EntrySet(Countries.DATA.length);
}
private FlyweightMap() {
}
public Set<java.util.Map.Entry<String, String>> entrySet() {
return entries;
}
//太长了,省略
但这是通过 IDEA 查看 jar 包里面的 class 文件的反编译视角看的源码(当初只找到 net.mindview.util 的 jar 包,没找到它的源码),然后发现有个地方不大懂:
就是static Map<String, String> map = new Countries.FlyweightMap((Countries.FlyweightMap)null);
这句,这句到原书里面是static Map<String, String> map = new FlyweightMap();
原来只是调用默认构造器,现在是给默认构造器传一个强转后的null
,这是什么操作啊?(恕我愚昧,这个问题我确实没百度到)
1
amiwrong123 OP 是我提问姿势不对吗,怎么还没有大佬现身。。。你们要是不信,可以自己把 net.mindview.util 的 jar 包加入工程看看,找到 Countries 这个 class,再对比原书代码。
下载地址: https://www.cnblogs.com/togeek/p/thiking_in_java_net_mindview_util_package.html |
2
jyounn 2019-10-21 15:38:32 +08:00
这个是编译后的文件,源文件是这样的吗?
|
3
amiwrong123 OP @jyounn
emmm, 源文件就是《 java 编程思想》——17.2.3 小节.使用 abstract 类里面的 Countries 类啊。 源文件确实不是这样的,好多代码顺序都变了。还有就是,有的语句声明和初始化本来是在一句里面,反编译后声明语句和初始化语句也分开了。 但这些变化都没有本质区别。 除了我在帖子里的那个疑问== |
4
amiwrong123 OP @jyounn
也许我应该,把书中的代码弄下来,自己编译出 class 再自己看看。。。 |
5
jyounn 2019-10-21 16:14:38 +08:00
@amiwrong123 需要了解下编译器具体做了些啥
|