首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
宝塔
V2EX  ›  程序员

Java new 关键字调用默认构造器,在反编译后就看不懂了

  •  
  •   amiwrong123 · 28 天前 · 816 次点击

    这个例子是 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,这是什么操作啊?(恕我愚昧,这个问题我确实没百度到)

    5 回复  |  直到 2019-10-21 16:14:38 +08:00
        1
    amiwrong123   27 天前
    是我提问姿势不对吗,怎么还没有大佬现身。。。你们要是不信,可以自己把 net.mindview.util 的 jar 包加入工程看看,找到 Countries 这个 class,再对比原书代码。

    下载地址: https://www.cnblogs.com/togeek/p/thiking_in_java_net_mindview_util_package.html
        2
    jyounn   27 天前
    这个是编译后的文件,源文件是这样的吗?
        3
    amiwrong123   27 天前
    @jyounn
    emmm, 源文件就是《 java 编程思想》——17.2.3 小节.使用 abstract 类里面的 Countries 类啊。

    源文件确实不是这样的,好多代码顺序都变了。还有就是,有的语句声明和初始化本来是在一句里面,反编译后声明语句和初始化语句也分开了。 但这些变化都没有本质区别。

    除了我在帖子里的那个疑问==
        4
    amiwrong123   27 天前
    @jyounn
    也许我应该,把书中的代码弄下来,自己编译出 class 再自己看看。。。
        5
    jyounn   27 天前
    @amiwrong123 需要了解下编译器具体做了些啥
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4229 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 02:28 · PVG 10:28 · LAX 18:28 · JFK 21:28
    ♥ Do have faith in what you're doing.