服务提供者框架 。
Class.forName("com.mysql.jdbc.Driver"); 这样一个语句会实例化一个Driver类(提供服务者实现类),并将这个类的实例注册到DriverManager(服务提供者注册类)。 DriverManager.getConnection("jdbc:mysql://...","...","..."); 这里通过建立连接的URL等信息来获取数据库连接。DriverManager通过传进来的url信息判断出你是要获取那个服务提供者提供的服务。因为 1 中已经将提供服务者实现类注册到DriverManager了,DriverManager获取到这个服务提供者实现类对象之后,通过调用它的getService(mysql里面是connect方法)方法获取到服务具体实现类对象,返回的却是java.sql.Connection接口对象(因为服务具体实现类实现了Connection接口),这样把服务具体实现类对象隐藏了。提供了很好的扩展性。 from —— A 类型转换方法,它接受单个参数并返回此类型的相应实例,例如:Date d = Date.from(instant); of —— 一个聚合方法,接受多个参数并返回该类型的实例,并把他们合并在一起,例如:Set faceCards = EnumSet.of(JACK, QUEEN, KING); valueOf —— from 和 to 更为详细的替代 方式,例如:BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE); instance 或 getinstance —— 返回一个由其参数 (如果有的话) 描述的实例,但不能说它具有相同的值,例如:StackWalker luke = StackWalker.getInstance(options); create 或 newInstance —— 与 instance 或 getInstance 类似,除了该方法保证每个调用返回一个新的实例,例如:Object newArray = Array.newInstance(classObject, arrayLen); getType —— 与 getInstance 类似,但是如果在工厂方法中不同的类中使用。Type 是工厂方法返回的对象类型,例如:FileStore fs = Files.getFileStore(path); newType —— 与 newInstance 类似,但是如果在工厂方法中不同的类中使用。Type 是工厂方法返回的对象类型,例如:BufferedReader br = Files.newBufferedReader(path); type —— getType 和 newType 简洁的替代方式,例如:List litany = Collections.list(legacyLitany); 如果一个类依赖于一个或多个底层资源,这些资源的行为会影响类的行为的时候,不要使用单例或静态的实用类来实现这个类,并且不让类直接创建这些资源。相反,将资源或工厂传递给构造方法(或静态工厂或 builder 模式)。这种称为依赖注入的实践将极大地增强类的灵活性、可重用性和可测试性。
//正确示范
@Override
public boolean equals(Object o) {
if (!(o instanceof MyType))
return false;
MyType mt = (MyType) o;
...
}
复制代码
< 和 > 运算符。 相反,使用包装类中的静态 compare 方法或 Comparator 接口中的构建方法。 // BROKEN difference-based comparator - violates transitivity!
static Comparator<Object> hashCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2) {
return o1.hashCode() - o2.hashCode();
}
};
/**
*不要使用这种技术!它可能会导致整数最大长度溢出和 IEEE 754 浮点运算失真的危险[JLS 15.20.1,15.21.1]。 此外,由此
*产生的方法不可能比使用上述技术编写的方法快得多。 使用静态 compare 方法:
*/
// Comparator based on static compare method
static Comparator<Object> hashCodeOrder = new Comparator<>() {
public int compare(Object o1, Object o2) {
return Integer.compare(o1.hashCode(), o2.hashCode());
}
};
//或者使用 Comparator 的构建方法:
// Comparator based on Comparator construction method
static Comparator<Object> hashCodeOrder =
Comparator.comparingInt(o -> o.hashCode());
//java8 比较 正序
someList.sort((Message m1, Message m2) -> m1.getSendDate().compareTo(m2.getSendDate()));
复制代码
《effective java》3rd -- Joshua Bloch