Java和ABAP中的引用類型有哪些-創(chuàng)新互聯

本篇內容介紹了“Java和ABAP中的引用類型有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

發(fā)展壯大離不開廣大客戶長期以來的信賴與支持,我們將始終秉承“誠信為本、服務至上”的服務理念,堅持“二合一”的優(yōu)良服務模式,真誠服務每家企業(yè),認真做好每個細節(jié),不斷完善自我,成就企業(yè),實現共贏。行業(yè)涉及成都餐廳設計等,在網站建設公司、成都全網營銷、WAP手機網站、VI設計、軟件開發(fā)等項目上具有豐富的設計經驗。

Java編程語言中幾種不同的引用類型是面試時經常容易被問到的問題:強引用,軟引用,弱引用,虛引用。

其實除了Java之外,某些 其他編程語言也有類似概念,比如ABAP。今天我們就來比較一下。

根據ABAP幫助文檔,我們可以把某個對象的引用包在一個Weak Reference的實例里。ABAP的Weak Reference實例通過類CL_ABAP_WEAK_REFERENCE實現。

看下面的例子:首先我在堆上創(chuàng)建了一個新的LCL_PERSON實例,然后包到一個ABAP weak reference里。

lo_person = NEW lcl_person( 'Jerry' ).

lo_weak = NEW cl_abap_weak_reference( lo_person ).

Java和ABAP中的引用類型有哪些

稍后,我們想拿到被包裹的lo_person引用時,使用weak reference提供的get方法。見下圖示例:

lo_person = CAST lcl_person( lo_weak->get( ) ).

引用lo_person什么時候會變成initial呢?如果當ABAP垃圾回收器(Garbage Collector)開始工作時,已經沒有任何引用再指向lo_person, 則lo_person會變成initial。

看下面這個例子加深理解。

REPORT ztest.
PARAMETERS: clear TYPE char1 as CHECKBOX DEFAULT abap_true,
gc TYPE char1 as CHECKBOX DEFAULT abap_true.
CLASS lcl_person DEFINITION.
PUBLIC SECTION.
DATA: mv_name TYPE string.
METHODS: constructor IMPORTING !iv_name TYPE string.
ENDCLASS.
CLASS lcl_person IMPLEMENTATION.
METHOD: constructor.
me->mv_name = iv_name.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lo_person TYPE REF TO lcl_person,
lo_weak TYPE REF TO cl_abap_weak_reference.
lo_person = NEW lcl_person( 'Jerry' ).
lo_weak = NEW cl_abap_weak_reference( lo_person ).
IF clear = abap_true.
CLEAR: lo_person.
ENDIF.
IF gc = abap_true.
cl_abap_memory_utilities=>do_garbage_collection( ).
ENDIF.
lo_person = CAST lcl_person( lo_weak->get( ) ).
IF lo_person IS INITIAL.
WRITE: / 'reference not available'.
ELSE.
WRITE: / 'reference still available'.
ENDIF.

這個report有兩個開關,如下圖。第一個開關控制lo_person這個引用是否被關鍵字CLEAR顯式地置為INITIAL, 第二個開關決定是否在代碼中顯式地調用ABAP垃圾回收器。

Java和ABAP中的引用類型有哪些

這兩個開關的打開和關閉狀態(tài),一共有4種組合。

Java和ABAP中的引用類型有哪些

在第一種情況下,通過關鍵字CLEAR清除了lo_person的引用,從ABAP的內存檢查器(事務碼s_memory_inspector)能發(fā)現,lo_person現在已經不指向任何內存中的對象了。

Java和ABAP中的引用類型有哪些

對于其他三種情況,LCL_PERSON的實例都不會被ABAP垃圾回收器清除:

Java和ABAP中的引用類型有哪些

Java

Java中的weak reference表現行為和ABAP一致。

我把上面的ABAP測試代碼用Java程序重新寫一遍:

import java.lang.ref.WeakReference;class Person {    private String mName;    public Person(String name) {        this.mName = name;
    }    public String getName() {        return this.mName;
    }
}public class WeakReferenceTest {    public static void check(Person person) {        if (person == null) {
            System.out.println("Reference invalid");
        }        else {
            System.out.println("Reference still available");
        }
    }    public static void main(String[] args) {
        Person jerry = null;
        WeakReference<Person> person = new WeakReference<Person>(new Person(                "Jerry"));
        jerry = new Person("Ben");        // if you comment out this line, Reference will be available
        System.gc();
        Person restore = person.get();
        check(restore);
    }
}

ABAP Soft reference - ABAP軟應用

在我目前使用的ABAP Netweaver 750 SP4系統(tǒng)中,ABAP軟應用尚未實現,

Java和ABAP中的引用類型有哪些

Java和ABAP中的幾種引用類型的分析和比較

在系統(tǒng)里只有個空的CL_ABAP_SOFT_REFERENCE, 其描述信息寫的是Do Not Use this Class!

Java和ABAP中的引用類型有哪些

Java和ABAP中的幾種引用類型的分析和比較

那么我們就來試試Java的軟應用 Soft Reference:

package reference;import java.lang.ref.SoftReference;import java.util.ArrayList;class Person2 {    private String mName;    public Person2(String name) {        this.mName = name;
    }    public String getName() {        return this.mName;
    }    public void finalize() {
        System.out.println("finalize called: " + this.mName);
    }    public String toString() {        return "Hello, I am " + this.mName;
    }
}public class SoftReferenceTest {    public static void main(String[] args) {
        SoftReference<Person2> person = new SoftReference<Person2>(new Person2(                "Jerry"));
        System.out.println(person.get());
        ArrayList<Person2> big = new ArrayList<Person2>();        for (int i = 0; i < 10000; i++) {
            big.add(new Person2(String.valueOf(i)));
        }
        System.gc();
        System.out.println("End: " + person.get());
    }
}

控制臺打印出的輸出:

Hello, I am Jerry

End: Hello, I am Jerry

即便我創(chuàng)建了1萬個Person對象的實例,確實消耗了一些內存,然后內存消耗還遠遠沒有大到會導致包含在軟應用中的Person2類的引用被JDK刪除掉的程度。因此我在代碼中調用Java的垃圾回收器System.gc()之后,該引用仍然存在。

在Java中,軟應用通常被用來實現在內存資源很有限的環(huán)境下的緩存機制,比如Android手機開發(fā)中。

Java 虛引用 PhantomReference

使用下面的代碼測試虛引用:

package aop;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;public class PhantomReferenceTest {    public static void main(String[] args) {
        Object phantomObj;
        PhantomReference phantomRef, phantomRef2;
        ReferenceQueue phantomQueue;
        phantomObj = new String("Phantom Reference");
        phantomQueue = new ReferenceQueue();
        phantomRef = new PhantomReference(phantomObj, phantomQueue);
        System.out.println("1 Phantom Reference:" + phantomRef.get());
        System.out.println("2 Phantom Queued: " + phantomRef.isEnqueued());
        phantomObj = null;
        System.gc();
        System.out.println("3 Anything in Queue? : " + phantomQueue.poll());        if (!phantomRef.isEnqueued()) {
            System.out.println("4 Requestion finalization.");
            System.runFinalization();
        }
        System.out.println("5 Anything in Queue?: " + phantomRef.isEnqueued());
        phantomRef2 = (PhantomReference) phantomQueue.poll();
        System.out.println("6 Original PhantomReference: " + phantomRef);
        System.out.println("7 PhantomReference from Queue: " + phantomRef2);
    }
}

測試輸出:

1. Phantom Reference: null

2. Phantom Queued: false

3. Anything in Queue? : null

5. Anything in Queue?: true

6. Original PhantomReference: java.lang.ref.PhantomReference@2a139a55

7. PhantomReference from Queue: java.lang.ref.PhantomReference@2a139a55

和之前介紹的弱引用(WeakReference)和軟引用(SoftReference)不同,包裹在虛引用(PhantomReference)中的對象實例無法通過需引用的get方法返回,因此在第一行輸出我們會看到: “1. Phantom Reference: null”.

在上面示例代碼中虛引用PhantomReference的構造函數里, 我傳入了一個隊列作為輸入參數。當包裹在虛引用實例中的對象引用被Java垃圾回收器刪除時,虛引用實例本身會自動被JVM插入我之前指定到虛引用構造函數輸入參數的那個隊列中去。

在System.runFinalization()執(zhí)行之前,phantomRef.isEnqueued()返回false,phantomQueue.poll()返回空。

當phantomObj實例被JVM刪除后, 虛引用PhantomReference本身被加入到隊列中,并且能夠通過隊列提供的API所訪問:phantomQueue.poll(). 打印輸出的第6行和第7行也說明了這一點。

“Java和ABAP中的引用類型有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯-成都網站建設公司網站,小編將為大家輸出更多高質量的實用文章!

新聞名稱:Java和ABAP中的引用類型有哪些-創(chuàng)新互聯
網頁URL:http://muchs.cn/article40/dgeheo.html

成都網站建設公司_創(chuàng)新互聯,為您提供GoogleApp設計、品牌網站設計虛擬主機、品牌網站建設商城網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

商城網站建設