使用单元素枚举实现单例

如果不涉及到线程安全及延迟加载,单例最简单的写法:

public class SingletonTest {
    public static final SingletonTest instance = new SingletonTest();
    private SingletonTest(){

    }
}

考虑到线程安全跟延迟加载,修改如下:

public class SingletonTest {
    public static final SingletonTest getInstance(){
        return SingletonTestHolder.instance;
    }
    private SingletonTest(){

    }
    static class SingletonTestHolder{
        private static final SingletonTest instance = new SingletonTest();
    }
}

这段代码不能解决反射攻击,及序列化的时候,readobject会返回新的对象,需要添加readResolve()方法,并且需要声明所有实例域都是transient(参考effective java第二章)

可以通过单元素枚举来解决以上问题:

public enum SingletonTest {
    instance;
    private int otherField;
}

缺点就是使用enum,无法使用类原本的功能比如继承。所以在合适的场合选择合适的单例写法吧

时间: 2024-10-23 15:58:20

使用单元素枚举实现单例的相关文章

使用单元素枚举类实现单例模式

在上一篇文章<单例模式的终结者--setAccessible(true)>中介绍了传统单例模式的不足之处,虽然枚举类实现单例模式还没有被广泛采用,但<effective java>里面已经承认单元素枚举类是实现单例模式最好的方法了. 下面写个小demo示范一下,这是只有一个元素的枚举类,枚举类里面也可以写方法. package go.derek; public enum EnumSingleton { instance; public void doSomething(){ Sys

HTML 5 服务器发送事件、Input 类型、表单元素、表单属性

HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新. Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能够自动到达. 例子:Facebook/Twitter 更新.估价更新.新的博文.赛事结果等. 浏览器支持 所有主流浏览器均支持服务器发送事件,除了 Internet Explorer. 接收 Server

JavaScript遍历HTML表单元素及表单定义

如下JavaScript代码,通过document对象,遍历HTML所有元素(HTML DOM Element ). <html> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <head> <script> //显示所有存在"ID"属性的HTML元素 function displayallelem(){ va

MVC中使用内建的HTML辅助方法产生表单元素提交表单与button按钮事件的陷阱

网站模板页有个登陆的退出按钮,当点击时跳转到登陆页面. <button onclick="logout()" >退出</button> $("#logOut").click(function () { location.href = "@Url.Action("Logout", "Account")"; }); 然后再某个页面楼主用了HTML辅助方法产生表单元素,代码如下所示: @H

JS基础-表单元素-新表单元素-js概述

1.表单元素 1.input元素 1.隐藏域和文件选项框 1.隐藏域 <input type="hidden"> 要提交给服务器的数据,但是不想展示给用户看可以放在隐藏域中. 2.文件选择框 <input type="file"> 注意: 1.method属性的值必须为post 2.enctype属性的值必须为multipart/form-data 2.textarea元素 1.作用 允许输入多行数据的文本框. 2.语法 标记:<tex

4.表单,表单元素,表单元素写法及属性

表单: 标签名: 1.form (表单)  action(路径 )  method (提交方式) 2.method(提交方式)提交方式有两种,一种是get提交方式,这是默认的. post的提交方式比较安全不会在路径中显示想要的数值, 在请求信息里面加参数, 表单元素 相关标签   fieldset (表单框) legend(表单框名) 文本类型:1.文本框(test) 2.密码框(postword)   3.隐藏域(hidde)   4.多行文本(textarea) disabled,reado

提交含文件和表单元素的表单到servlet

public void upload(HttpServletRequest request,HttpServletResponse response){ DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024*500); File tempDIrectory = new File("d:\\tempDirectory"); factory.setRepository(t

javascript 中表单元素的操作

1.访问form元素 1.1获得表单 oForm = document.getElementById("myForm"); oForm = document.forms["myForm"]; oForm = document.forms[0]; 1.2表单元素 通过表单字段:oForm.elements[0]; 通过名称:oForm.text1;oForm.["he is a boy"];//每个表单字段成为表单的属性,通过name值访问 1.3

第六十七节,html表单元素

html表单元素 学习要点: 1.表单元素总汇 2.表单元素解析 本章主要探讨HTML5中表单元素,表单元素用于获取用户的输入数据.   一.表单元素总汇 HTML5的表单中,提供了各种可供用户输入的表单控件.           元素名称                                        说明             form          表示HTML表单             input         表示用来收集用户输入数据的控件