单例模式的实现-枚举
枚举实例单例是线程安全的,JVM类实例化会担保。
spring源码示例:
代码语言:javascript复制public enum JdbcColumnTypes {
INSTANCE {
@SuppressWarnings({ "unchecked", "rawtypes" })
public Class<?> resolvePrimitiveType(Class<?> type) {
return javaToDbType.entrySet().stream() //
.filter(e -> e.getKey().isAssignableFrom(type)) //
.map(e -> (Class<?>) e.getValue()) //
.findFirst() //
.orElseGet(() -> (Class) ClassUtils.resolvePrimitiveIfNecessary(type));
}
};
private static final Map<Class<?>, Class<?>> javaToDbType = new LinkedHashMap<>();
static {
javaToDbType.put(Enum.class, String.class);
javaToDbType.put(ZonedDateTime.class, String.class);
javaToDbType.put(OffsetDateTime.class, OffsetDateTime.class);
javaToDbType.put(LocalDateTime.class, LocalDateTime.class);
javaToDbType.put(Temporal.class, Timestamp.class);
}
public abstract Class<?> resolvePrimitiveType(Class<?> type);
}
源码来自:
代码语言:javascript复制 <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jdbc</artifactId>
<version>2.3.4</version>
</dependency>
枚举,不仅仅为我们提供实现常量的定义,如java源码:
代码语言:javascript复制/**
* Defines access modes used to test the accessibility of a file.
*
* @since 1.7
*/
public enum AccessMode {
/**
* Test read access.
*/
READ,
/**
* Test write access.
*/
WRITE,
/**
* Test execute access.
*/
EXECUTE;
}
而且我们还可以实现方法(实例方法、静态方法、抽象方法),自定义业务逻辑。
单例模式的实现-静态内部类
mybatis源码示例:
代码语言:javascript复制
public abstract class VFS {
/** Singleton instance holder. */
private static class VFSHolder {
static final VFS INSTANCE = createVFS();
static VFS createVFS() {
.....
}
}
/**
* Get the singleton {@link VFS} instance. If no {@link VFS} implementation can be found for the current environment,
* then this method returns null.
*
* @return single instance of VFS
*/
public static VFS getInstance() {
return VFSHolder.INSTANCE;
}
}
源码来自:
代码语言:javascript复制 <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
1、内部类是延迟加载的,JVM担保内部类的加载及实例化是线程安全的;
2、单例类的构造函数是private的;
3、内部类也是私有静态内部类;
4、私有静态内部类实例负责创建静态类实例,一般会创建属性INSTANCE并实例化;
5、单例类提供静态方法getInstance(),返回私有静态内部类的属性INSTANCE;