解決循環(huán)引用導(dǎo)致的解析過程死循環(huán)

什么是循環(huán)引用

循環(huán)引用(Cyclic Reference)是指在數(shù)據(jù)結(jié)構(gòu)(如對象、類或模塊)中,兩個或多個元素相互引用,形成一個閉環(huán)。

帶來的問題

這種情況在編程中可能導(dǎo)致內(nèi)存泄漏、解析過程無限循環(huán)或其他問題

解析過程觸發(fā)無限循環(huán)

    public void bug(){
        // 數(shù)據(jù) mock
        Node node = mock();
        // 解析觸發(fā)死循環(huán)
        Parsed parse = parse(node);
    }

    private Node mock() {
        Node node = new Node();
        Node node1 = new Node();
        node.value = node1;
        node.name = "node";
        node1.value = node;
        node1.name = "node1";
        return node;
    }

    class Node {
        Node value;
        String name;
    }

    class Parsed {
        Parsed value;
        String name;
    }


    private Parsed parse(Node node) {
        int i = node.hashCode();
        Parsed result = new Parsed();
        result.value = parse(node.value);
        result.name = node.name;
        return result;
    }

解決方案

    public void test(){
        // 數(shù)據(jù) mock
        Node node = mock();
        // 解析
        Parsed parse = parse(node, new HashMap<>());
    }

    private Node mock() {
        Node node = new Node();
        Node node1 = new Node();
        node.value = node1;
        node.name = "node";
        node1.value = node;
        node1.name = "node1";
        return node;
    }

    class Node {
        Node value;
        String name;
    }

    class Parsed {
        Parsed value;
        String name;
    }
    
    private Parsed parse(Node node, HashMap<Integer, Parsed> cache) {
        int i = node.hashCode();
        Parsed result = null;
        // 通過緩存記錄解析結(jié)果,
        // 如果被解析對象已經(jīng)被解析過了,則直接引用,避免陷入無限循環(huán)
        if (cache.containsKey(i)) {
            result = cache.get(i);
        } else {
            result = new Parsed();
            cache.put(i, result);
            result.name = node.name;
            result.value = parse(node.value,cache);
        }
        return result;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容