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. 实验吧—Web——WP之 Forms

    我们先打开解题链接: 做Web题的第一步就是查看网页源代码,当然,有些网页他不会让你点击右键,那么可以在地址栏里的地址前面加上:view-source: 当然也可以打开控制台F12 我们可以看到代码里 ...

  2. day 52 js学习 DOM 和BOM

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  3. 04基于python玩转人工智能最火框架之TensorFlow开发环境搭建

    MOOC_VM.vdl.zip 解压之后,得到一个vdl文件.打开virtual box,新建选择类型linuxubuntu 64位. 选择继续,分配2g.使用已有的虚拟硬盘文件,点击选择我们下载的文 ...

  4. C# to IL 4 Keywords and Operators(关键字和操作符)

    Code that is placed after the return statement never gets executed. In the first programgiven below, ...

  5. python-廖雪峰,map/reduce学习笔记

    # _*_ coding:utf-8 _*_from functools import reduce def str2int(s): digits = {'0': 0, '1': 1, '2': 2, ...

  6. Odoo 开源协议讨论

    Odoo 开源协议讨论 Odoo 9 开始使用的 LGPL 开源协议,所以模块的加密并不会违反 Odoo 的开源协议. 如果使用 Odoo 8 (含)以前的版本开发模块,那么你在分发模块时也必须给使用 ...

  7. 5 个关于 API 中日期和时间设计规则

    规则 #1 使用ISO-8601格式作为你的日期格式 ISO 8601 解决了很多问题,包括: 自然排序 - 简单和优雅,免去多余的工作即可实现排序 时区偏移 - 代表用户的地点和时区在日益增长的全球 ...

  8. day8 大纲

    01 昨日内容回顾 文件操作 文件操作的流程: 1,打开文件创建文件句柄. 2,对文件句柄进行操作. 3,关闭文件句柄. 读, r r+ rb r+b read() 全部读取 read(n) 读取一部 ...

  9. Maven知识整理

    一.概念: Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统( ...

  10. direct3d

    DirectX for .Net procedure 1, install DXSDK  https://www.microsoft.com/en-us/download/details.aspx?i ...