服务提供者框架
。
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