zoukankan      html  css  js  c++  java
  • java中友元的完美实现(转载)

    http://blog.sina.com.cn/s/blog_ce5b9f7e0102vhiv.html

    C++中有一个友元机制,可以给予一个类访问另一个类中私有成员的权限。

      这个机制有时候是很有用的。比如一个电视机类,其中有选台的私有方法,我们希望除了遥控器类以外所有的类都不能访问它。在C++中我们可以通过将遥控器类设置为选台的友元的方式来实现。
      再比如,我们创建了一个类,但不允许其他人直接对它实例化,而是要通过一个factory类来产生。这样,我们便可以把这个类的构造函数设为private,并将factory设为这个构造函数的友元。
      然而,JAVA中却并未提供这样的机制。我在网上搜索时看到了http://yangdong.iteye.com/blog/907397这篇文章,其中提供了一个方法,是这样的:
    java中友元的完美实现

     这样,由于A.func为private,故它只能被A.Friend.func(A)访问,又A.Friend.func(A)为protected,于是它只能被A.Friend及其子类访问。由Friend的构造方法可知,任何不是B的A子类都不能实例化。又通过B的final防止了B的子类通过static方法中调用new B().func(a)对A.func的访问。于是A.func只能被类B访问,和C++中设置B为A.func的友元一样。
     
    然而,这个方法有两个缺陷:
    一、JAVA中protected保护的对象并非只能被子类访问,还可以被同一个包中的其他类访问。于是和AB同在一个包中的类C中就可以通过new B().func(A)的方式访问该方法。
    二、B被设为final,导致它不能被继承。JAVA没有多重继承,B继承了A.Friend,那么它就不能再继承其他任何类。
    三、同样由于JAVA没有多重继承,B只能作为一个类的友元。即B作了A的友元,就做不了C的友元。
    于是,我对它进行了修改:
    java中友元的完美实现

    首先,由于B.A_B_Friend重写了_func(A),导致对它进行调用只有B.A_B_Friend.func(A)这唯一的途径,而它又是private,故它只能被类B调用。
    其次,B没有final的限制,也没有继承任何类的限制。
    最后,由于内部类没有数量限制,故B可以做任何数量的类的友元。
     
    从而,用JAVA完美的实现了友元机制。当然,由于复杂的代码,它还称不上完美。但对于有必要使用友元的地方,毕竟算是不错的方案
  • 相关阅读:
    zlib压缩一个文件为gzip格式
    最短路径算法Dijkstra
    用MonoDevelop开发Linux游戏
    Flask入门1HelloWorld
    Windows+Linux打造和谐的开发环境
    WinCE 6.0下的编译选项
    使用cvrtbin.exe转换bin文件到nb0
    美的电磁炉(SK2106)加热断断续续问题的快速修复(原创)
    解决XP下双网卡不能同时用
    USB驱动程序打包(转)
  • 原文地址:https://www.cnblogs.com/devilwind/p/8058646.html
Copyright © 2011-2022 走看看