第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法在Java中模擬C ++的“朋友”概念?

有沒有辦法在Java中模擬C ++的“朋友”概念?

蝴蝶刀刀 2019-07-25 19:30:11
有沒有辦法在Java中模擬C ++的“朋友”概念?我希望能夠在一個包中編寫一個Java類,它可以訪問另一個包中的類的非公共方法,而不必使它成為另一個類的子類。這可能嗎?
查看完整描述

3 回答

?
三國紛爭

TA貢獻(xiàn)1804條經(jīng)驗 獲得超7個贊

Java的設(shè)計者明確拒絕了朋友的想法,因為它在C ++中有效。你把你的“朋友”放在同一個包里。私有,受保護(hù)和打包的安全性是語言設(shè)計的一部分。

James Gosling希望Java能夠成為C ++而不會出錯。我相信他覺得朋友是個錯誤,因為它違反了OOP原則。包提供了一種合理的方式來組織組件而不會過于純粹的OOP。

NR指出你可以使用反射作弊,但即使只有你沒有使用SecurityManager才有效。如果打開Java標(biāo)準(zhǔn)安全性,除非您編寫安全策略以明確允許,否則您將無法使用反射作弊。


查看完整回答
反對 回復(fù) 2019-07-25
?
www說

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊

“朋友”概念在Java中很有用,例如,將API與其實現(xiàn)分開。實現(xiàn)類通常需要訪問API類內(nèi)部,但這些不應(yīng)該暴露給API客戶端。這可以使用'Friend Accessor'模式實現(xiàn),詳情如下:

通過API公開的類:

package api;public final class Exposed {
    static {
        // Declare classes in the implementation package as 'friends'
        Accessor.setInstance(new AccessorImpl());
    }

    // Only accessible by 'friend' classes.
    Exposed() {

    }

    // Only accessible by 'friend' classes.
    void sayHello() {
        System.out.println("Hello");
    }

    static final class AccessorImpl extends Accessor {
        protected Exposed createExposed() {
            return new Exposed();
        }

        protected void sayHello(Exposed exposed) {
            exposed.sayHello();
        }
    }}

提供“朋友”功能的課程:

package impl;public abstract class Accessor {

    private static Accessor instance;

    static Accessor getInstance() {
        Accessor a = instance;
        if (a != null) {
            return a;
        }

        return createInstance();
    }

    private static Accessor createInstance() {
        try {
            Class.forName(Exposed.class.getName(), true, 
                Exposed.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(e);
        }

        return instance;
    }

    public static void setInstance(Accessor accessor) {
        if (instance != null) {
            throw new IllegalStateException(
                "Accessor instance already set");
        }

        instance = accessor;
    }

    protected abstract Exposed createExposed();

    protected abstract void sayHello(Exposed exposed);}

來自'friend'實現(xiàn)包中的類的示例訪問:

package impl;public final class FriendlyAccessExample {
    public static void main(String[] args) {
        Accessor accessor = Accessor.getInstance();
        Exposed exposed = accessor.createExposed();
        accessor.sayHello(exposed);
    }}


查看完整回答
反對 回復(fù) 2019-07-25
  • 3 回答
  • 0 關(guān)注
  • 497 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號