一个良好的程序设计应该是层次清晰,各模块对于外部模块来说,是否只提供了对外的API而隐藏了具体的实现细节,通常对于使用者而言,只需要知道实现功能的API 而无法操作具体实现的过程,这种设计理念被称为信息隐藏也就是我们通常所说的封装。

对于顶层的设计 例如接口之类的类只有两种访问级别

包级私有(只能被同级包下的其他类和接口访问  也就是默认修饰符 default)和公有(public)

举个例子

package IO.Demo;
public interface DemoTest {static final String NUMBER="ONE";
}
package IO.FileIo;

import IO.Demo.DemoTest;

public class Demo {    private DemoTest demoTest;}
 

接口 DemoTest 和类 Demo 分别属于不同的包

IO.Demo和IO.FileIo

请注意这时的 DemoTest 是属于顶级接口 被public修饰 表示公有的 这时它可以在Demo类中被调用

假如此时去掉public修饰符 则此时的会发生这样的情况

Demo此时无法调用接口 原因就是不在同级包下无法调用

如果类和接口能被设定为包级私有的,请将它设计为包级私有的

对于成员(域(也就是变量常量)、方法、嵌套类和嵌套接口)有四种可能的访问级别

1 private (私有的)  只有在声明的该成员的顶层类内部才能访问到这个成员 但是有一点需要注意 在接口里面是不能被声明为private的。 大家可以考虑下为什么会是这样?

2 包级私有的 简称缺省的(default)

3 受保护的(protected) 声明该成员的子类可以访问这个成员(有一定限制)

4 公有的(public) 表示在任意地方都可以访问该成员

以上的4中访问修饰符是按照访问递增等级排列的。

举个应用例子

package IO.FileIo;public class Demo {private static  void run(){}public static void startRun(){run();}public static void main(String[] args) {Demo.startRun();}
}

在同包内的Test类中无法调用Demo类私有的Run()方法 但是Demo提供了使用Run方法的startRun()方法

这种做法就是应用了封装的理念

最近项目中 有一个程序设计的要求是要求把数据库查询的数据存储到内存中,减少对数据库的访问次数,减少程序的开销

package IO.FileIo;import java.util.HashMap;
import java.util.Map;public class Demo {private static Map<String,Object> cache=new HashMap<String,Object>();private static  Map<String,Object> run(){//假定这个方法里面执行了获取数据库数据的方法 getData()://cache=getData();//此时cache里面已经存在了数据 注意看cache是被static修饰的 cache存在方法区中// 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。// 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。// 所以此时cache的值被存储在内存中return cache;}public static Map<String,Object> startRun(){return run();}}

如何拿到这个map

package IO.FileIo;import java.util.Map;public class Test {public static void main(String[] args) {//此时调用的Demo.startRun() 会有一个Map的引用被传回来 我们就可以对数据进行操作了//在spring框架中Controller层就可以把这个map传到页面呈现Map<String,Object> map= Demo.startRun();}
}

在这里我们用到了啥

 private static Map<String,Object> cache=new HashMap<String,Object>();
Demo类中cache是私有的 我们对外提供了获得这个对象引用的API
startRun()在其他类中我们就可以调用这个方法来获取cache 而隐藏了具体怎么获得cache的细节

对于类的设计而言 ,类的域决不能是公有的(public)

例如这样

public class Test {public String password;}

此时的password可以被任意类被使用修改数值 假如这个属性被你用作充当用户的密码属性 这是灾难性的后果

public class Demo {public static void main(String[] args) {Test test=new Test();test.password="1";System.out.println(test.password);}}

在其他类中 Test的password域直接被修改,这并不是程序设计的初衷,这样会导致数据的不可控

java是面向对象的所以java提供了让外部操作内部数据域的方法 get/set

这里提供了最简单的get/set方法实现(spring ioc的依赖注入于这种方式来注入)

public class Test {private  String password;public String getPassword() {return password;}public void setPassword(String password) {this.password = password; } }

这样程序的数据域就在可控制的范围 ,开发程序的过程中完全可以在setPassword()中对数据域进行限制,而不是让数据被肆无忌惮的修改

 

转载于:https://www.cnblogs.com/tongAngle/p/10160971.html

类和接口的使用-类和成员可访问性最小化相关推荐

  1. 第13条 类与接口——使类和成员的可访问性最小化

    要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.正确使用修饰符对于实现信息隐藏是非常关键的. 第一规则很简单:尽可能地使每个类 ...

  2. Effective Java之使类和成员的可访问性最小化(十三)

    对于类 对于类,只有public和package-private两种访问级别. 1.对于顶层的类来说,只有包级私有和公有两种可能,区别是包级私有意味着只能在当前包中使用,不会成为导出api的一部分,而 ...

  3. 使类和成员的可访问性最小化

    模块之间只能通过api进行通信,也就是通过暴露出来的预先定义好的函数进行通信,一个模块不需要,也不应该知道其他模块的内部工作情况,这个概念叫做信息隐藏,,也叫封装,是软件设计的重要的基本原则之一.之所 ...

  4. Java基础学习——Java网络编程(三)自定义枚举类、枚举类的常用方法、枚举类实现接口、枚举类的实际应用

    一.什么是枚举 枚举法:一枚一枚的列举出来,列举的元素是有限的.确定的. 例如:星期(一.二.三.四.五.六.日).性别(男.女).季节(春.夏.秋.冬) 在Java中的关键字为enum 二.枚举类的 ...

  5. java电脑类的接口_java 一个类实现两个接口的案例

    直接用英文逗号分隔就可以了,比如:? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 inerface IHello { String sayHello ...

  6. C#语言 SqlClient接口SQL Sever数据库类+OleDb接口Access数据库类

    有空再写Oracle.IBM的吧.其实除了连接字符串格式,也只是换换数据库接口名. using System; using System.Data; using System.Data.SqlClie ...

  7. 《Effective Java 2nd》第4章 类和接口

    目录 第13条: 使类和成员的可访问性最小化 第14条:在公有类中使用访问方法而非公有域 第15条:使可变性最小化 第16条:复合优先于继承 第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 ...

  8. 【04】Effective Java - 类和接口

    为什么80%的码农都做不了架构师?>>>    1.使类和成员的可访问性最小化 封装是软件设计的基本原则之一,它的好处就是解除组成系统的各个模块之间的耦合关系,使得这些模块可以独立地 ...

  9. 《Effective Java》读书笔记三(类和接口)

    No13 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.模块之间只通过它们的API进行通信,一个 ...

最新文章

  1. 使用复合索引代替单键索引,来避免单键有null值的情况
  2. Boost:gzifstream和gzofstream的测试程序
  3. iOS之仿QQ好友列表展开收缩效果的实现
  4. 与IO相关的等待事件troubleshooting-系列9
  5. [kubernetes] 解决k8s.gcr.io Image 导入导出 等问题
  6. DB 数据同步到数据仓库的架构与实践
  7. CANN AICPU算子耗时分析及优化探索
  8. pcb设计单点接地示意图_EMC设计之接地、PCB布局布线、屏蔽设计
  9. 基于麻雀搜索算法优化深度置信网络的分类方法(SSA-DBN)
  10. bilibili发送弹幕
  11. 《程序人生》2020无畏年少青春,迎风潇洒前行,杭漂程序员2019的心路历程,披荆斩棘终雨过天晴
  12. 1.4版走迷宫小游戏
  13. 在 JavaScript 中如何克隆对象?
  14. matlab 变量的定义变量名称,matlab定义变量名
  15. CCF CSP 201809-1 卖菜 题解
  16. 如何正确的使用 Service?
  17. 华为nova5z和nova5i 哪个好?有什么区别?
  18. cocos2dX 之音乐与音效
  19. cad线性标注命令_CAD尺寸标注命令
  20. 我做碘131治疗的经历20190903

热门文章

  1. 计算机论文写作提纲怎么写,信息技术论文提纲写作示例
  2. 002 html总结
  3. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
  4. 18、监听器/国际化
  5. 15款精美的 WordPress 电子商务网站模板
  6. 从文件中读取数据以创建图
  7. 利用栈实现递归函数的非递归计算
  8. 诗与远方:无题(四)
  9. Java支持IPv6研究
  10. Linux Page Cache参数调优在kafka中的应用