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

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

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

这样,由于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的友元。
于是,我对它进行了修改:

首先,由于B.A_B_Friend重写了_func(A),导致对它进行调用只有B.A_B_Friend.func(A)这唯一的途径,而它又是private,故它只能被类B调用。

其次,B没有final的限制,也没有继承任何类的限制。
最后,由于内部类没有数量限制,故B可以做任何数量的类的友元。
 
从而,用JAVA完美的实现了友元机制。当然,由于复杂的代码,它还称不上完美。但对于有必要使用友元的地方,毕竟算是不错的方案

java中友元的完美实现(转载)的更多相关文章

  1. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  2. Java中的static关键字解析 转载

    原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...

  3. java中main函数解析(转载)

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  4. Java基础——深入理解Java中的final关键字(转载)

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  5. 为什么说Java中只有值传递(转载)

    出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...

  6. 浅谈Java中的hashcode方法(转载)

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  7. java中volatile关键字的含义 (转载)

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

  8. 在java中写出完美的单例模式

    1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例 ...

  9. java中关键字volatile的作用(转载)

    转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...

随机推荐

  1. mvc core2.1 Identity.EntityFramework Core 用户Claims查看(七)

    添加角色属性查看 Views ->Shared->_Layout.cshtml <div class="navbar-collapse collapse"> ...

  2. 《DSP using MATLAB》Problem 5.12

    1.从别的地方找的证明过程: 2.代码 function x2 = circfold(x1, N) %% Circular folding using DFT %% ----------------- ...

  3. 日志分析-mime统计

    提取日志中未落入标准字段的mime,分adx,adtype 统计mime的数量和包含js的数量占比 require 'date' require 'net/http' require 'uri' re ...

  4. 简单webpack plugin 开发

    重要是学习下怎么开发webpack plugin,同时记录下 插件模型 webpack 是一个插件,可以是javascript class ,或者具名 class 定义apply 方法 指定一个绑定到 ...

  5. Modern Data Lake with Minio : Part 2

    转自: https://blog.minio.io/modern-data-lake-with-minio-part-2-f24fb5f82424 In the first part of this ...

  6. codeblock设置快捷键

    第一步: 第二步: 第三步:  格式化代码设置: 在代码框里点右键,按Format use Astyle就会自动代码格式化了 但是它默认的风格是大括号另起一行,很不习惯,实际上是可以改的 1.Sett ...

  7. Python---Pycharm如何直接上传自己的代码到GitHub

    请提前到官网注册GitHub账号,提前在terminal或者cmd安装git,然后你要检测自己电脑是否存在 SSH key,然后需要把SSH key复制下来,粘贴到你的GitHub. - 第一步:安装 ...

  8. Jmeter的NON-GUI模式

    一般来讲,Jmeter执行压测,都是用Jmeter的命令模式,脚本调试好, 测试脚本能够大大缩减所需要的系统资源. 1.1命令介绍: jmeter -n -t <testplan filenam ...

  9. java 同步代码块与同步方法

    同步代码块 synchronized (obj) { // 代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是 ...

  10. Visual Studio中设置Nuget程序包源

    用vs2015,默认的程序包源是Microsoft and .NET,很多常见的开源包在里面搜索不到. 这时候就需要配置一个更开放的包源,网上搜了一下,都没人提供这个问题,所以自己动脑花了一番脑经,看 ...