java創建對象的五種方法

首先定義一個Bean對象,我這裏定義了3個,因爲後面兩個分別爲了測試clone和反序列化單獨定義的。

public class Bean {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

public class BeanClone implements Cloneable{
	
	private String name;

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

public class DeserializeBean implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	private String name;

	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
}

下面是五種方法的詳細代碼:
package com.steven.cn;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.logging.Logger;

/**
 * 
 * @ClassName: CreateBeanMethods 
 * @Description: 創建對象的方法類
 * @author: Stevnen_sf
 * @date: 2018年12月27日 上午10:20:40
 */
public class CreateBeanMethods {
	
	private CreateBeanMethods() {}
	private static Logger logger = Logger.getLogger("CreateBeanMethods");
	
	/**
	 * 
	 * @Title: newMethod 
	 * @Description: 關鍵字new
	 * @return
	 * @return: Bean
	 */
	public static Bean newMethod() {
		return new Bean();
	}
	
	/**
	 * 
	 * @Title: newInstanceMethod 
	 * @Description: 類的newInstance()方法
	 * @return
	 * @return: Bean
	 */
	public static Bean newInstanceMethod() {
		Bean bean = null;
		try {
			bean = Bean.class.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			logger.info(e.getMessage());
		}
		return bean;
	}
	
	/**
	 * 
	 * @Title: constructorNewInstanceMethod 
	 * @Description: 構造器Constructor的newInstance()方法
	 * @return
	 * @return: Bean
	 */
	public static Bean constructorNewInstanceMethod() {
		Bean bean = null;
		try {
			Constructor<Bean> constructor = Bean.class.getConstructor();
			bean = constructor.newInstance();
		} catch (Exception e) {
			logger.info(e.getMessage());
		}
		return bean;
	}

	/**
	 * 
	 * @Title: cloneMethod 
	 * @Description: 使用clone()方法,需要先實現Cloneable接口,並自定義clone()方法
	 * @return
	 * @return: BeanClone
	 */
	public static BeanClone cloneMethod() {
		BeanClone bean = new BeanClone();
		BeanClone beanClone = null;
		try {
			beanClone = (BeanClone) bean.clone();
		} catch (CloneNotSupportedException e) {
			logger.info(e.getMessage());
		}
		return beanClone;
	}
	
	/**
	 * 
	 * @Title: deserializeMethod 
	 * @Description: 反序列化 :這個方法比較麻煩,不經常用
	 * @return
	 * @return: DeserializeBean
	 */
	public static DeserializeBean deserializeMethod() {
		String tempFile = "temp.txt";
		DeserializeBean object = new DeserializeBean();
		DeserializeBean deserializeBean = null;
		try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File(tempFile)));
				ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(tempFile)))) {
			out.writeObject(object);
			out.flush();
			deserializeBean = (DeserializeBean) in.readObject();
			
		} catch (Exception e) {
			logger.info(e.getMessage());
		}
		deleteTemp(tempFile);
		return deserializeBean;
	}
	
	/**
	 * 
	 * @Title: deleteTemp 
	 * @Description: 刪除序列化的臨時文件
	 * @param filePath
	 * @return: void
	 */
	private static void deleteTemp(String filePath) {
		File file = new File(filePath);
		try {
			Path path = file.toPath();
			Files.delete(path);
		}catch(IOException e) {
			logger.info(e.getMessage());
		}
	}
}

最後是主方法的運行結果:
public class Main {
	
	public static void main(String[] args) {
		// 第一種方法 Bean
		System.out.println("第一種方法:" + CreateBeanMethods.newMethod().getClass().getSimpleName());
		
		// 第二種方法 Bean
		System.out.println("第二種方法:" + CreateBeanMethods.newInstanceMethod().getClass().getSimpleName());
		
		// 第三種方法 Bean
		System.out.println("第三種方法:" + CreateBeanMethods.constructorNewInstanceMethod().getClass().getSimpleName());
		
		// 第四種方法 BeanClone
		System.out.println("第四種方法:" + CreateBeanMethods.cloneMethod().getClass().getSimpleName());
		
		// 第五種方法 DeserializeBean
		System.out.println("第五種方法:" + CreateBeanMethods.deserializeMethod().getClass().getSimpleName());
	}
}

運行結果


最後,給大家提供一下源碼的下載地址,上面的代碼已經夠詳細了,已經沒多大必要下載源碼了: 源碼下載地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章