《THING IN JAVA》 6章访问权限控制-读书笔记

前言:

(1)关于需要设置访问权限的理解:改动任何一个成员都有可能破坏客户端程序员的代码。于是类库开发者会手脚被缚,无法对任何事物进行改动

1、包:库单元

(1)每个编译单元只能有一个public类,否则编译器就会报错,而且它们主要用来为主public类提供支持,如果一个单元不具备一个public类,则这个单元无法被外界访问,在JAVA里是不允许的。
(2)类库实际上是一组类文件,其中每个文件都有一个public类。
(3)JAVA解析器的运行过程如下:首先,找出环境变量CLASSPATH(通过操作系统设置),CLASSPATH包含一个或多个目录,用作查找.class的根目录。从根目录开始,解析器获取包的名称并把每个句点替换成反斜杠,以从CLASSPATH根中产生一个路径名称。
(4)当simple库的import语句时,就开始在CLASSPATH所指定的目录中查找。
(5)关于用import改变行为:JAVA没有C的条件编译功能,该功能可以使你不必更改任何程序代码,就能够切换开关并产生不同的行为。JAVA去掉此功能的原因可能是因为C在绝大多数情况下是用此功能来解决跨平台问题的,即程序代码的不同部分是根据不同的平台来编译的。由于JAVA自身可以自动跨越不同的平台,因此这个功能对JAVA而言是没有必要的。然而条件编译还有其它一些有价值的用途。调试就是一个很常见的用途。调试功能在开发过程中是开启的,而在发布的产品中是禁用的。
(6)编译过的代码通常放置在与源代码的不同目录中,但是必须保证JAVA使用CLASSPATH可以找到该路径

2、JAVA访问权限修饰词

(1)public、protected和private这几个JAVA访问权限修饰词在使用时,是置于类中每个成员的定义之前的-无论它是一个域还是一个方法  

(2)默认访问权限没有任何关键字,但通常是指包访问权限(有时候表示成为friendly)                 

(3)可以将类的构造器的访问权限声明为private,可以有效的控制如何创建对象,并防止别人直接访问某个特定的构造器(或全部构造器)


3、接口和实现

(1)把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装


4、类的访问权限

(1)虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名

(2)但是通常来说,将与类(包访问权限)相同的访问权限赋予方法也是很合理的。既然一个有包访问权限的类通常只能被用于包内,那么如果对你有强制要求,在此情况下,编译器会告诉你,你只需要将这样的方法设定为public就可以了

(3)请注意类既不可以是private的,也不可以是protected的(内部类除外),否则编译器会报错,仅有两个选择:包访问权限或pulbic。如果不希望其他任何人对该类拥有访问权限,可以把所有的构造器都制定为private,从而 阻止任何人创建该类的对象,但是有一个例外,就是你在该类的static成员内部可以创建。下面展示一个实例:


public class MyTest7 {
public static void main(String[] args){
testStatic();          //如果想要在返回引用之前在Soup1上做一些额外的工作,或是记录产生了多少各对象
testSingleton();       //这种特定的模式被称为singleton(单例),始终只创建一个对象
}

static void testStatic(){
Soup1 soup = Soup1.makeSoup();
soup.f();
}

static void testSingleton(){
Soup2 soup = Soup2.access();
soup.f();
}

}


class Soup1{
private Soup1(){}
public static Soup1 makeSoup(){
return new Soup1();
}
public void f(){
System.out.println("static");
}
}


class Soup2{
private Soup2(){}
private static Soup2 ps1 = new Soup2();
public static Soup2 access(){
return ps1;
}
public void f(){
System.out.println("singleton");
}
}

运行结果:

static

singleton


如果我们自己编写了默认的构造器,那么就不会自动创建它了。如果把该构造器指定为private,那么就谁也无法创建该类的对象了。

如果想要在返回引用之前在Soup1上做一些额外的工作,或是如果想要记录到底创建了多少个Soup1对象(可能要限制其数量),这种做法将会是大有裨益的。

Soup2的这种特定的模式被称为singleton(单例)


5、总结

(1)设立一些为各成员遵守的界限始终是很重要的。

(2)用C语言开发项目,在50千行至100千行代码之间就会出现问题。这是因为C语言仅有单一的“名字空间”,并且名称开始发生冲突,引发额外的管理开销。

(3)关于客户端程序员,一般业务逻辑上用public,private就已经足够了,除非客户端程序员想建立更强大的类库

(4)控制对成员的访问权限有两个原因:一是为了使用户不要碰触那些他们不该碰触的部分,简化了他们对类的理解,二是类库的设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员产生重大的影响(因为声明为private的变量、方法,其他类无法访问),这样就可以随意的改善设计

(5)类的公共接口是用户真正能够看到的,如果在最初无法创建出正确的接口,那么只是不删除任何客户端程序员在他们的程序中已经用到的东西,就可以在以后添加更多的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值