重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)

简介: 重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)

第6章讲到了类库设计的权限访问问题,主要是通过Java提供的访问权限修饰词,让类库的使用者明白哪些是可用的,那些事不可用的。访问权限控制等级,从最大权限到最小权限依次为:public、protected、包访问权限(没有关键词)和private。作为一名类库设计员,你会尽可能将一切方法都定义为private,而仅向客户端程序员公开你愿意让他们使用的方法。

“6.1 包:库单元”,包内包含一组类,它们在单一的名字空间下被组织在一起。例如,在Java的标准发布中有一个工具库,它被组织在java.util名字空间之下。java.util中有一个叫做ArrayList的类,使用ArrayList的一种方式是用其全名java.util.ArrayList来指定。

publicclassFullQualification { 
publicstaticvoidmain(String[] args) { 
java.util.ArrayListlist=newjava.util.ArrayList(); 
    } 
}

但是这会使得程序变得冗长,因此你可能向转而使用import关键字。如果你想要导入单个的类,可以在import语句中命名该类:

importjava.util.ArrayList; 
publicclassSingleImport { 
publicstaticvoidmain(String[] args) { 
ArrayListlist=newjava.util.ArrayList(); 
    } 
}

要想使用java.util中的其他类,只需要使用“*”,就可以了:import java.util.*; 这就是Java提供的一种管理名字空间的机制。为什么要有名字空间这么个概念呢?假设你编写一个Stack类并安装到了一台机器上,而该机器上已经有了一个别人写的Stack类,我们该如何解决呢?由于名字之间的潜在冲突,在Java中对名字空间进行完全控制并为每一个类创建唯一的标识组合就成为了非常重要的事情了。上面列举的一些类的例子虽然没有指定包名,其实他们已经位于包中了:即未命名包或者默认包。私用关键字package关键字,可以指定一个类的包名:package access;

6.2 创建独一无二的包名这一小节告诉我们如何给package起一个有效的名字里让我们的类减少可能的冲突。按照惯例,package名称的第一部分是类的创建者的反顺序的Internet域名。比如cn.com.domain。第二部分可以把package名称分解为你机器上的一个目录。比如:business.directory。举个具体的例子来理解这一点,以我的域名是MindView.net为例。顺序倒过来就是net.mindview。为了演示个简单的例子,我们再创进一个simple的目录,我们的类就放在这个目录下,那么完整的包名如下:package net.mindview.simple;现在这个包名就可以作为下面两个文件的名字空间保护伞了:

packagenet.mindview.simple; 
publicclassVector { 
publicVector() { 
System.out.println("net.mindview.simple.Vector"); 
    } 
} 
packagenet.mindview.simple; 
publicclassList { 
publicList() { 
System.out.println("net.mindview.simple.List"); 
    } 
}

下面就可以写一个例子引入我们的类库并且使用它们了:

importnet.mindview.simple.*; 
publicclassLibTest { 
publicstaticvoidmain(String[] args) { 
Vectorv=newVector(); 
Listl=newList(); 
    } 
}

有了上面的只是以后,我们就可以进入到“6.3 定制工具库”这一小节,创建自己的工具库来减少或消除重复的程序代码了。举个打印输出的例子:

packagenet.mindview.util; 
importjava.io.*; 
publicclassPrint { 
// Print with a newline: publicstaticvoidprint(Objectobj) { 
System.out.println(obj); 
    } 
// Print a newline by itself: publicstaticvoidprint() { 
System.out.println(); 
    } 
// Print with no line break: publicstaticvoidprintnb(Objectobj) { 
System.out.print(obj); 
    } 
// The new Java SE5 printf() (from C): publicstaticPrintStreamprintf(Stringformat, Object... args) { 
returnSystem.out.printf(format, args); 
    } 
} 
importstaticnet.mindview.util.Print.*; 
publicclassPrintTest { 
publicstaticvoidmain(String[] args) { 
print("Available from now on!"); 
print(100); 
print(100L); 
print(3.14159); 
    } 
}

/* Output:

Available from now on!

100

100

3.14159

*/

上面的例子只是为了说明包名空间的使用,以后我们有新的工具类,都可以放在net.mindview.util类库中。

目录
相关文章
|
29天前
|
存储 NoSQL Java
Java数据库编程指南:实现高效数据存储与访问
【4月更文挑战第2天】Java开发者必须掌握数据库编程,尤其是JDBC,它是连接数据库的标准接口。使用Spring JDBC或JPA能简化操作。选择合适的JDBC驱动,如MySQL Connector/J,对性能至关重要。最佳实践包括事务管理、防SQL注入、优化索引和数据库设计。NoSQL数据库如MongoDB也日益重要,Java有对应的驱动支持。理解这些概念和技术是构建高效数据库应用的基础。
Java数据库编程指南:实现高效数据存储与访问
|
2月前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
23 2
|
3天前
|
运维 NoSQL Java
Serverless 应用引擎产品使用之在函数计算上部署Java服务并访问阿里云MongoDB如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 0
|
13天前
|
安全 Java API
java借助代理ip,解决访问api频繁导致ip被禁的问题
java借助代理ip,解决访问api频繁导致ip被禁的问题
|
14天前
|
存储 NoSQL Java
探索Java分布式锁:在高并发环境下的同步访问实现与优化
【4月更文挑战第17天】Java分布式锁是解决高并发下数据一致性问题的关键技术,通过Redis、ZooKeeper、数据库等方式实现。它确保多节点共享资源时的同步访问,防止数据不一致。优化策略包括锁超时重试、续期、公平性和性能优化。合理设计分布式锁对支撑大规模分布式系统至关重要。
|
15天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
2月前
|
Java
Java包及访问限定
Java包及访问限定
9 0
|
2月前
|
SQL Java 关系型数据库
Java数据库访问
Java数据库访问
|
2月前
|
前端开发 Java 生物认证
java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示
java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示
37 0