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完美的实现了友元机制。当然,由于复杂的代码,它还称不上完美。但对于有必要使用友元的地方,毕竟算是不错的方案
  • 相关阅读:
    Linux环境变量$PATH
    grep
    echo命令
    ip命令
    浅析Linux下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc文件
    shell脚本4种执行方式
    /proc路径
    tr命令
    Linux命令cut
    前端论坛网站知识
  • 原文地址:https://www.cnblogs.com/devilwind/p/8058646.html
Copyright © 2011-2022 走看看