effecitve java 3 singleton 1
5258 ワード
package singleton.finalfield;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Elvis{
public static final Elvis INSTANCE = new Elvis();
private Elvis(){
// ,
if (null != INSTANCE) {
throw new RuntimeException("Elvis is singleton class, you can not create another one !!!!!!!!!!");
}
}
public void saySth(){
System.out.println("something");
}
}
public class FinalFieldTest {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
Class elvisClass = Elvis.class;
Constructor>[] constructors = elvisClass.getDeclaredConstructors();
for (Constructor> constructor : constructors) {
constructor.setAccessible(true);
}
Elvis elvis = (Elvis) constructors[0].newInstance();
}
}
package singleton.staticfactorymethod;
class Elvis{
private static final Elvis INSTANCE = new Elvis();
private Elvis(){}
public static Elvis getInstance(){
return INSTANCE;
}
}
public class StaticFactoryMethodTest {
public static void main(String[] args) {
Elvis instance = Elvis.getInstance();
}
}
package singleton.antiserialization;
import java.io.*;
class Elvis implements Serializable {
public static final Elvis INSTANCE = new Elvis();
private Elvis(){
if (null != INSTANCE) {
throw new RuntimeException("Elvis is singleton class, you can not create another one !!!!!!!!!!");
}
}
public void saySth(){
System.out.println("something");
}
// readResolve , ,
private Object readResolve(){
return INSTANCE;
}
}
public class AntiSerializationTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("Object.txt"));
Elvis elvis = (Elvis) objectInputStream.readObject();
ObjectInputStream objectInputStream2 = new ObjectInputStream(new FileInputStream("Object.txt"));
Elvis elvis2 = (Elvis) objectInputStream2.readObject();
System.out.println(elvis == elvis2);
}
public static void write(String[] args) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object.txt"));
Elvis instance = Elvis.INSTANCE;
objectOutputStream.writeObject(instance);
objectOutputStream.close();
}
}
package singleton.enummethod;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
enum Elvis{
ONE;
public void saySth(){
System.out.println("hello");
}
}
public class EnumTest {
public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
Class elvisClass = Elvis.class;
Constructor>[] declaredConstructors = elvisClass.getDeclaredConstructors();
for (Constructor> declaredConstructor : declaredConstructors) {
declaredConstructor.setAccessible(true);
}
Object o = declaredConstructors[0].newInstance();
}
public static void read(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("Object2.txt"));
Elvis elvis = ( Elvis) objectInputStream.readObject();
ObjectInputStream objectInputStream2 = new ObjectInputStream(new FileInputStream("Object2.txt"));
Elvis elvis2 = (Elvis) objectInputStream2.readObject();
System.out.println(elvis == elvis2);
}
public static void write(String[] args) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("object2.txt"));
objectOutputStream.writeObject(Elvis.ONE);
objectOutputStream.close();
}
}