第6章 访问权限控制

简介:

引言:访问权限(或隐藏具体实现)与“最初的实现并不恰当”有关。

先了解两个概念:

封装(encapsulation,即隐藏对象的属性和实现细节,仅对外公开接口。

重构(Refactoring就是通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。

程序员分为两类,类库的消费者和类库的开发者,类库的消费者希望类库出现新版本的时候,他们并不需要改写他们的代码,而类库的开发者则必须有权限对类库进行修改和改进,而不影响客户端程序员。

这就要求我们将“变动的事物”与“保持不变的事物”区分开来。

这正是访问权限的作用所在。

1. 包:库单元

包提供了一个管理命名空间的机制。目的是将所有类成员的名称彼此隔离。

包名的命名规范参见前面的文章http://blog.csdn.net/qq_18738333/article/details/49828349

编译单元是一个带后缀名.Java的文件,编译单元内只能有一个public类,且该类的名称必须与文件名相同。编译一个.java文件,其中的每个类都会生成一个后缀名为.class的文件。

Java可运行程序是一组可以打包并压缩为一个Java文档文件(JAR,使用Javajar生成器)的.class文件。Java解释器负责对这些文件的寻找、装载和解释

类库是一组类文件,每个文件都有一个public类,以及任意数量的非public文件,用关键字package组合到一起。

package语句必须作为文件的第一个非注释语句出现,表明该编译单元是某个类库的一部分,但使用一个类库时,必须用import语句导入。

需要记住:packageimport语句关键字允许你做的,是将单一的全局名字空间分割开,使得无论多少人在使用InternetJava编写类,都不会出现名称冲突的问题。

2. Java访问权限修饰词

1. 包访问权限

2. public:接口访问权限

3. protect:继承访问权限

4. private:私有

获得访问权限的方法有这些:

(1) 使成员成为“public”(公共的)。这样所有人从任何地方都可以访问它。

(2) 舍弃所有访问指示符,并将其类置于相同的包内。这样一来,包内的其他类就可以访问成员。

(3) 继承的类既可以访问一个protected成员,也可以访问一个public成员(但不可访问private成员)。

(4) 提供“访问器(accessor)/变异器(mutator)”方法(亦称为“获取(get)/设置(set)”方法),以便读取和修改值。这是OOP环境中最优雅的一种方法。

 

不多累赘,只记录需要注意的用法:

1. 默认包为包内的文件提供了包访问权限

2. 类的访问权限只有包访问权限和public两种选择。

3. 如果想控制如何创建对象,并阻止别人访问某个特定的构造器(或者全部构造器),可以使用private修饰构造器,用一个static方法控制创建对象。这就是单例模式(singleton。这是很常见的设计模式,比如游戏引擎中的导演类。

看下面这段代码

//: Lunch.java
// Demonstrates class access specifiers.
// Make a class effectively private
// with private constructors:
 
class Soup {
  private Soup() {}
  // (1) Allow creation via static method:
  public static Soup makeSoup() {
    return new Soup();
  }
  // (2) Create a static object and
  // return a reference upon request.
  // (The "Singleton" pattern):
  private static Soup ps1 = new Soup();
  public static Soup access() {
    return ps1;
  }
  public void f() {}
}
 
class Sandwich { // Uses Lunch
  void f() { new Lunch(); }
}
 
// Only one public class allowed per file:
public class Lunch {
  void test() {
    // Can't do this! Private constructor:
    //! Soup priv1 = new Soup();
    Soup priv2 = Soup.makeSoup();
    Sandwich f1 = new Sandwich();
    Soup.access().f();
  }
} ///:~


目录
相关文章
|
6月前
|
JSON 数据格式
|
6月前
|
存储 监控 安全
数据访问权限如何通过角色管理实现?
【6月更文挑战第24天】数据访问权限如何通过角色管理实现?
89 9
|
6月前
|
存储 监控 安全
数据访问权限
【6月更文挑战第24天】数据访问权限
137 5
|
6月前
|
JSON JavaScript 数据格式
如何控制权限,更加好的方法
如何控制权限,更加好的方法
|
资源调度 前端开发 数据库
权限 | 前端控制权限
啊,我们经常做权限控制,控制菜单,控制按钮功能等,但是在一些特殊情况下不能够由后端来做权限控制,那就只能前端来做啦。
|
中间件 数据安全/隐私保护
使用RoleBasedAuthorization实现基于用户角色的访问权限控制
本文将介绍如何通过 [Sang.AspNetCore.RoleBasedAuthorization](https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization) 库实现 RBAC 权限管理。
186 0
使用RoleBasedAuthorization实现基于用户角色的访问权限控制
|
安全 Java 数据管理
基于角色访问控制RBAC权限模型的动态资源访问权限管理实现
前面主要介绍了元数据管理和业务数据的处理,通常一个系统都会有多个用户,不同用户具有不同的权限,本文主要介绍基于RBAC动态权限管理在crudapi中的实现。RBAC权限模型(Role-Based Access Control)即:基于角色的权限控制。模型中有几个关键的术语: 用户:系统接口及访问的操作者 权限:能够访问某接口或者做某操作的授权资格 角色:具有一类相同操作权限的用户的总称 。 #### 用户角色权限关系 一个用户有一个或多个角色 一个角色包含多个用户 一个角色有多种权限 一个权限属于多个角色
728 0
基于角色访问控制RBAC权限模型的动态资源访问权限管理实现
|
存储 安全 算法
项目之用户登录和访问权限的控制(5)
项目之用户登录和访问权限的控制(5)
153 0
|
安全 Java 测试技术
项目之用户登录和访问权限的控制(6)
项目之用户登录和访问权限的控制(6)
267 0