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)安全性,除非您編寫安全策略以明確允許,否則您將無法使用反射作弊。

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); }}
添加回答
舉報
0/150
提交
取消