何时使用静态 API

看了《AutoMapper and the Static Class Debate》,记录一下自己的看法。

在进行API设计时,静态类的使用有时会为设计者带来一些烦恼。应该将某个函数暴露为静态函数还是实例方法,这一点常常会造成人们的争论。

大部分人学完设计模式后,都会尽量使用单例模式。但是,静态函数的主要优点在于其简便性。调用者可以在代码中的任意位置使用静态函数,而无需为实例的创建、管理以及依赖注入等问题而烦恼。同时,由于没有创建新的实例,因而也不存在垃圾回收的问题,从而使性能也得以提高。

当然,有时静态API也需要维护一些状态,这时设计者必须保证静态函数的线程安全,而这往往牵涉到开销较大的加锁与同步等技术。而且即便独立的调用是线程安全的,但调用者也往往需要将一系列调用过程封装为一个原子性的事务。

无状态的尽量设计为静态。

我在面试应试者时,往往会问的一个问题是:使用单例模式相对于使用静态方法,有什么绝对性的优势?(或者说,有什么是单例能做到的,但是使用静态 API 的设计却无法办到的?)

读者,你知道吗?

时间: 2024-09-28 20:54:52

何时使用静态 API的相关文章

Promise 静态api用法总结

Promise 静态方法 allSettled  返回结果是个对象数组,对象数组中值的顺序和传入Promise时的顺序一致. 返回所有promise的执行结果,只能在then中获取,不执行catch. 每个对象包含 status(Promise状态), value(Promise执行成功的结果), reason(Promise执行失败的结果). all   返回结果,取决于Promise执行的情况, 如果有大于等于1个promise报错,会抛出错误在catch中捕获, 错误的信息是最先 reje

利用BeEF REST API自动化控制僵尸主机

本文已发布于Freebuf,属于原创奖励计划,未经许可禁止转载. http://www.freebuf.com/articles/network/137662.html 一. 前言 关于BeEF,不再多介绍,它的强大毋庸置疑,利用它我们可以做很多事情.最近的一些实验,需要用beef批量自动进行控制,发现网上也没有过多关于这方面内容的介绍,于是学习了一下它的API,顺便练习一下python编程,这里把自己的学习内容分享下.本文涉及的一些内容可能具有一定的攻击性,请遵守国家法律,禁止用于非法用途.

【ASP.NET Web API教程】2.4 创建Web API的帮助页面

参考页面: http://www.yuanjiaocheng.net/CSharp/csharprumenshili.html http://www.yuanjiaocheng.net/entity/mode-first.html http://www.yuanjiaocheng.net/entity/database-first.html http://www.yuanjiaocheng.net/entity/choose-development-approach.html http://ww

利用BeEF REST API自动化控制僵尸主机 --转载--作者ssooking

一. 前言 关于BeEF,不再多介绍,它的强大毋庸置疑,利用它我们可以做很多事 情.最近的一些实验,需要用beef进行批量自动控制,发现网上也没有过多关于这方面内容的介绍,于是学习了一下它的API,顺便练习一下python编 程,这里把自己的学习内容分享下.本文涉及的一些内容可能具有一定的攻击性,请遵守国家法律,禁止用于非法用途. 二. 通过API控制beef BeEF从0.4.3.3,版本开始,提供了静态API接口,用户可以通过发送HTTP / JSON请求控制Beef. 我们可以通过程序,批

【ASP.NET Web API教程】2.4 创建Web API的帮助页面[转]

注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. 2.4 Creating a Help Page for a Web API2.4 创建Web API帮助页面 本文引自:http://www.asp.net/web-api/overview/creating-web-apis/creating-a-help-page-for-a-web-api By Mike Wasson | August 3, 2012作者:Mike Wasson

Refactoring to collection(译)

<Refactoring To Collection>#####本文是翻译Adam Wathan 的<Collection To Refactoring>的试读篇章,这篇文章内容不多,但是可以为我们Laraver使用者能更好使用collection提供了可能性,非常值得看看.虽然是试读部分,但是Wathan还是很有诚意的,试读文章还是能学到东西的,但是遗憾的是,我大概搜了下,目前好像还没有中文版,为此,我决定翻译这篇文章,让英文不太好的朋友,可以学习这篇文章. 获取试读文章:htt

RobotFramework 学习总结

RobotFramework 测试库(Test library) 资源文件(Resource file) 变量文件(Variable file) 测试模版(Template)将关键字驱动模式改成数据驱动模式 不同的测试用例模式: 关键字驱动模式 数据驱动模式: 行为驱动模式: 静态和动态测试库之间唯一的不同就是,Robot Framework 如何发现测试库实现了哪些关键字,包括这些关 键字的参数和文档,以及这些关键字实际执行的方式.对于静态 API,这些动作都是通过反射(除了 Java 测试库

NodeJS&amp;&amp;前端思考

做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 yo 等 工程脚手架,生成项目基本框架 5.包管理工具 npm 足够简单易用 MEAN架构: MEAN 是目前最潮的全栈 JavaScript 架构.MEAN 是一个 JavaScript 平台的现代 Web 开发框架总称,它是 MongoDB Express AngularJS Node.js 四

robotframework笔记22

创建测试库 支持的编程语言 机器人框架本身是用写的 Python 和自然的测试 库扩展它可以使用相同的实现 语言. 运行时框架上 Jython ,图书馆也可以 实现使用 Java . 纯Python代码Python和工作 Jython,假设它不使用语法或模块 可在Jython. 当使用Python,也是可能的 实现与C库使用 Python C API ,尽管它是 往往更容易与C代码从Python库使用 ctypes 模块. 图书馆使用这些支持本地语言可以实现 也作为包装器使用其他功能实现 编程语