您的位置:首页 > 运维架构

【设计模式:单例模式】使用单例模式载入properties文件

2016-03-01 12:35 344 查看
先准备測试程序:

package org.jediael.util;
import static org.junit.Assert.*;
import org.junit.Test;

public class BasicConfigurationTest {
@Test
public void testGetValue(){
BasicConfiguration configuration = BasicConfiguration.getInstance();
assertTrue(configuration.getValue("key").equals("value"));
}
}


当中properties文件里有一行例如以下:

key=value

优先选择方案三

方式一:懒汉方式

到第一次使用实例时。才载入实例

package org.jediael.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BasicConfiguration {

private static BasicConfiguration configuration = null;
private Properties pros = null;

public static synchronized BasicConfiguration getInstance(){
if(configuration == null){
configuration = new BasicConfiguration();
}
return configuration;
}

public String getValue(String key){
return pros.getProperty(key);
}

private BasicConfiguration(){
readConfig();
}

private void readConfig() {
pros = new Properties();
InputStream in = null;
try {
in = new FileInputStream(Thread.currentThread().getContextClassLoader().getResource("")
.getPath() + "search.properties");
pros.load(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上述程序中。产生了BasicConfiguration的一个单例。

优点是仅仅有到第一次调用getInstance才生成对象,节省了空间。不足之处在于同步锁导致有可能运行过慢。

2、饿汉方式

package org.jediael.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BasicConfiguration {

private static BasicConfiguration configuration = new BasicConfiguration();
private Properties pros = null;

public static BasicConfiguration getInstance(){
return configuration;
}

public String getValue(String key){
return pros.getProperty(key);
}

private BasicConfiguration(){
readConfig();
}

private void readConfig() {
pros = new Properties();
InputStream in = null;
try {
in = new FileInputStream(Thread.currentThread().getContextClassLoader().getResource("")
.getPath() + "search.properties");
pros.load(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


因为BasicConfiguration的实例是static。因此,当类被载入时就会初始化,但这样即使并不须要使用此实例,也会被初始化,导致内存空间的浪费。

方式三:

package org.jediael.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class BasicConfiguration {

private Properties pros = null;

private static class ConfigurationHolder{
private static BasicConfiguration configuration = new BasicConfiguration();
}

public static BasicConfiguration getInstance(){
return ConfigurationHolder.configuration;
}

public String getValue(String key){
return pros.getProperty(key);
}

private BasicConfiguration(){
readConfig();
}

private void readConfig() {
pros = new Properties();
InputStream in = null;
try {
in = new FileInputStream(Thread.currentThread().getContextClassLoader().getResource("")
.getPath() + "search.properties");
pros.load(in);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}


因为初始化放在内部类中,仅仅有当此内部类被使用时,才会进行初始化。

从而既节省了空间。也无需同步代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: