静态设计
发布日期:2021-10-01 08:45:00
浏览次数:3
分类:技术文章
本文共 1347 字,大约阅读时间需要 4 分钟。
作者: 在我们系统设计中,类方法的功能设计一般是改变对象的状态,以及返回对象的信息。然而在这两种情况之外,还存在一种类型的方法,其设计目的,是专为系统提供某种特定的功能,作为系统专用的一种工具,有的书上称之为“工具方法”,一般情况下,我们会将这类方法设计成静态的,保证系统中所有的代码都可以使用它。在Java API中,最典型的例子之一是java.lang.Math类,它的所有变量、方法都是静态的,专为数学计算而设计。 static double PI; // 类变量,代表圆周率 static double abs( double a); // 类方法,取双精度浮点类型参数的绝对值
经过关键字static修饰后,对象中的实例变量或实例方法就成为了类变量、类方法,使用静态的好处是,在代码中,我们可以不用创建对象而直接使用类变量和类方法,这样可以简化我们的代码,减少系统的内存开销。例如,在多处需要使用这些方法所提供的功能时,如果使用实例方法,就需要我们创建多个对象来调用这些方法,对于一个规模庞大的系统来说,这通常是不理智的,使用静态方法,可以保证该静态方法仅会存在于系统内存中的一个地址段内。从这里也可以看出,静态方法内应该尽量使用类变量代替实例变量,否则在多次调用静态方法的过程中,会创建多个实例变量,增加系统占用的内存空间。 Java虚拟机第一次加载类的时候,会初始化静态的代码块,这和实例变量和实例方法的加载时间不一样。静态的代码可以存放在一个static代码块中,在类加载的时候一起初始化,但是在static代码块中不能抛出异常: static { double i = java.lang.Math.random(); long time = System.currentTimeMillis();}
现在来理解“静态”,简而言之,就是一旦在系统中生成,其地址就不再改变的变量或方法,因此,静态设计可以为我们提供如下方便: 1.简化或优化代码。 2.减少系统的内存开销。 3.分离出系统中的工具类。 世上少有鱼与熊掌兼得得事,如果漫无目的地使用静态,也会出现一些意外情况。 静态变量在内存中只会存在一份拷贝,而静态设计的目的之一是要为系统提供一系列通用的工具,因此所有的代码都可以对静态变量进行访问或改变它的值,这样容易使设计者对当前变量所存储的值产生疑惑,不知道是谁动了我的“奶酪”。 如果在程序上面静态导入相应的包、类,在程序中可以不使用类名,这样会给代码阅读者带来混淆。静态导入的格式: import static com.sun.staticClassTools.CommonTool;
静态变量(类变量)的生命周期是从类的第一次加载到应用程序的结束,使用静态变量存储集合通常会带来巨大的内存开销,因为Java垃圾回收不会回收在以静态方式存在的集合对象,直到应用程序终止,哪怕这些集合对象已经不再使用。 静态设计违反OO设计原则,它是非面向对象的,类似于C语言中的全局函数,以过程的思想处理我们的代码。 因此,过度的静态设计会给我们的程序带来包括内存泄漏在内的多种问题,一般情况下,如果可以不使用静态,应该尽量避免,保证系统中的每一处静态设计都有其明确的存在的意义。 转载地址:https://blog.csdn.net/iteye_263/article/details/81420041 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年03月27日 16时12分12秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android应用构建:10:使用sdkmanager管理sdk
2019-04-27
Kubernetes基础:MacOS上设定Dashboard
2019-04-27
Go基础:MacOS上配置go语言开发环境
2019-04-27
Operator基础:1: Operator Framework简介
2019-04-27
Operator基础:2: Operator SDK安装
2019-04-27
Operator基础:3: 使用Operator SDK创建Operator
2019-04-27
GitLab基础:使用API获取某个项目下所有成员及权限信息
2019-04-27
Subversion Edge:下载官方旧版的Subversion Edge
2019-04-27
OpenEuler简介与安装
2019-04-27
轻量级容器引擎iSula简介
2019-04-27
Bash基础:在MacOS上确认版本与升级Bash的方法
2019-04-27
版本管理:Subversion Edge:旧版使用OpenJDK的问题和对应方法
2019-04-27
版本管理工具:CentOS下安装配置Subversion Edge 4.0.14
2019-04-27
zsh下brew安装
2019-04-27
Kubernetes 1.3 从入门到进阶 安装篇(1)
2019-04-27
HP-UX 使用SAM进行Printer设定
2019-04-27
Kubernetes 1.3 从入门到进阶 安装篇(2)
2019-04-27
Docker基础: Linux内核命名空间之(6)user namespace
2019-04-27
docker 1.13以及新特性
2019-04-27
事务、本地事务、分布式事务
2019-04-27