Effecvtive Java Note
- 代码应该被重用,而不是被拷贝
- 同大多数学科一样,学习编程的艺术首先要学会基本的规则,然后才能知道什么时候可以打破这些规则
//抽象产品角色
public interface Car {
public void drive();
}
//具体产品角色
public class Benz implements Car {
public void drive() {
System.out.println("Driving Benz ");
}
}
public class Bmw implements Car {
public void drive() {
System.out.println("Driving Bmw ");
}
}
//工厂类角色
public class Driver {
//工厂方法.注意 返回类型为抽象产品角色
public static Car driverCar(String s) throws Exception {
//判断逻辑,返回具体的产品角色给Client
if (s.equalsIgnoreCase("Benz")) return new Benz();
else if (s.equalsIgnoreCase("Bmw")) return new Bmw();
else throw new Exception();
}
}
//欢迎暴发户出场......
public class Magnate {
public static void main(String[] args) {
try {
//告诉司机我今天坐奔驰
Car car = Driver.driverCar("benz");
// /下命令:开车
car.drive();
}
}
}
public interface Builder<T> {
public T build();
}
3.用私有构造器或者枚举类型强化singleton(实例化一次)属性
public enum Elvis{
INSTANCE;
public void something(){}
}
Long sum = 0L;
for (long i = 0; i < Integer.MAX_VALUE; i++) {
sum += i;
}
public class Person {
private Date brithdate;
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmt = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmt.set(1946,Calendar.JANUARY,1,0,0,0);
BOOM_START=gmt.getTime();
gmt.set(1965,Calendar.JANUARY,1,0,0,0);
BOOM_END=gmt.getTime();
}
public boolean isBaby(){
return brithdate.compareTo(BOOM_START)>=0 &&brithdate.compareTo(BOOM_END)<0);
}
}
只创建了一次实例
@Override
protected Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
public class Complex {
private final double re;
private final double im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
public Complex add(Complex complex){
return new Complex(re+complex.re,im+complex.im);
}
}
public class ForwardingSet implements Set {
private final Set set;
public ForwardingSet(Set set){
this.set=set;
}
@Override
public int size() {
return set.size();
}
@Override
public boolean isEmpty() {
return set.isEmpty();
}
@Override
public boolean contains(Object o) {
return set.contains(0);
}
@NonNull
@Override
public Iterator iterator() {
return set.iterator();
}
@NonNull
@Override
public Object[] toArray() {
return set.toArray();
}
@Override
public boolean add(Object o) {
return set.add(o);
}
@Override
public boolean remove(Object o) {
return set.remove(o);
}
@Override
public boolean addAll(@NonNull Collection c) {
return set.addAll(c);
}
@Override
public void clear() {
set.clear();
}
@Override
public boolean removeAll(@NonNull Collection c) {
return set.removeAll(c);
}
@Override
public boolean retainAll(@NonNull Collection c) {
return set.retainAll(c);
}
@Override
public boolean containsAll(@NonNull Collection c) {
return set.containsAll(c);
}
@NonNull
@Override
public Object[] toArray(@NonNull Object[] a) {
return set.toArray(a);
}
}
统计add了几次
public class InstrumentedSet extends ForwardingSet {
private int addCount=0;
public InstrumentedSet(Set set) {
super(set);
}
@Override
public boolean add(Object o) {
addCount++;
return super.add(o);
}
@Override
public boolean addAll(@NonNull Collection c) {
addCount+=c.size();
return super.addAll(c);
}
public int getAddCount(){
return addCount;
}
}
public class Super {
public Super(){
overrideMe();
}
public void overrideMe() {
}
}
public class Sub extends Super {
private final Date date;
Sub (){
date=new Date();
}
@Override
public void overrideMe() {
System.out.print(date);
}
public static void main(String[]args){
Sub sub = new Sub();
sub.overrideMe();
}
}
public class Figure {
enum Shape {RECTACNGLE, CIRCLE}
final Shape shape;
double length;
double width;
double radius;
Figure(double radius){
shape=Shape.CIRCLE;
this.radius=radius;
}
Figure(double length,double width){
shape=Shape.RECTACNGLE;
this.length=length;
this.width=width;
}
double area(){
switch (shape){
case RECTACNGLE:
return length*width;
case CIRCLE:
return Math.PI*(radius*radius);
default:
throw new AssertionError();
}
}
}
abstract class Figure{
abstract double area();
}
class Circle extends Figure{
final double radius;
Circle(double radius){
this.radius=radius;
}
@Override
double area() {
return Math.PI*(radius*radius);
}
}
public interface Comparator <T>{
public int compare(T t1,T t2);
}
Arrays.sort(stringArray,new Comparator<String>(){
return s1.length()-s2.length();
});
public class Host {
private static class StrlenCmp implements java.util.Comparator<String>,Serializable{
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
}
public static final java.util.Comparator<String> STRING_LEN_COMPARATOR=new StrlenCmp();
}
enum Operation {
PLUS,MINUS,TIMES,DIVIDE;
Double apply(double x,double y){
switch (this){
case PLUS: return x+y;
case MINUS:return x-y;
case TIMES:return x*y;
case DIVIDE:return x/y;
}
throw new AssertionError("Unknown op" + this);
}
}
enum Operation {
PLUS {
@Override
Double apply(double x, double y) {
return x+y;
}
},MINUS {
@Override
Double apply(double x, double y) {
return x-y;
}
},TIMES {
@Override
Double apply(double x, double y) {
return x*y;
}
},DIVIDE {
@Override
Double apply(double x, double y) {
return x/y;
}
};
abstract Double apply(double x,double y);
}
如果给operation添加新常量,你就不可能忘记提供apply方法,因为枚举类型中的抽象方法必须被它所有的常量中的具体方法所覆盖。
public enum Operation {
PLUS("+") {
@Override
Double apply(double x, double y) {
return x+y;
}
},MINUS("-") {
@Override
Double apply(double x, double y) {
return x-y;
}
},TIMES ("*"){
@Override
Double apply(double x, double y) {
return x*y;
}
},DIVIDE ("/"){
@Override
Double apply(double x, double y) {
return x/y;
}
};
private String symbol;
Operation(String symbol) {
this.symbol=symbol;
}
@Override
public String toString() {
return symbol;
}
abstract Double apply(double x, double y);
}
double x=3;
double y=4;
for (Operation operation : Operation.values()) {
System.out.printf("%f %s %f = %f%n",x,operation,y,operation.apply(x,y));
}
public enum Ensemble {
SOLO(1),DUET(2),TRIO(3);
Ensemble(int i) {
}
}
interface Operation{
double apply(double x,double y);
}
Effecvtive Java Note的更多相关文章
- java note
1.List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复.
- Life Cycle of Thread – Understanding Thread States in Java
Life Cycle of Thread – Understanding Thread States in Java 深入理解java线程生命周期. Understanding Life Cycle ...
- JAVA学习博客---2015-8
八月份的学习博客,今天已经是九月四号了,补上吧.现在我又回到C++了,JAVA的基本的东西都懂了,但是更好的掌握JAVA,我必须原路返回去学习C++,当初为了更快的学JAVA,其实我得C++都是跳着看 ...
- 学习 java命令
依稀记得自己第一次编译*.java文件,第一次运行*.class文件.但是六七年过去了,现在运行java写的程序更多的是用tomcat这种web容器.最近有个小需求,写一个监控zookeeper集群的 ...
- Core Java Volume I — 1.2. The Java "White Paper" Buzzwords
1.2. The Java "White Paper" BuzzwordsThe authors of Java have written an influential White ...
- Java Performance Optimization Tools and Techniques for Turbocharged Apps--reference
Java Performance Optimization by: Pierre-Hugues Charbonneau reference:http://refcardz.dzone.com/refc ...
- Java+7入门经典 -1 简介
第一章 Java简介 1.1 Java概览 applet程序可嵌入网页; Java会通过隐式检测禁止Java applet的恶意代码; Java Server Pages-JSP 创建服务器应用程序, ...
- Linux巩固记录(2) java项目的编译和执行
由于要近期使用hadoop等进行相关任务执行,操作linux时候就多了 以前只在linux上配置J2EE项目执行环境,无非配置下jdk,部署tomcat,再通过docker或者jenkins自动部署上 ...
- Java图形化界面设计——布局管理器之GridBagLayout
GridBagLayout 不会随着窗口的变化标签随之发生变化,可固定. ---------------------------------------------------------- impo ...
随机推荐
- SpringBoot应用部署到Tomcat中无法启动问题
SpringBoot应用部署到Tomcat中无法启动问题 背景 最近公司在做一些内部的小型Web应用时, 为了提高开发效率决定使用SpringBoot, 这货自带Servlet容器, 你在开发We ...
- 安装卸载selenium
安装: C:\Users\xiongjiawei>pip install selenium==2.48.0 Collecting selenium==2.48.0 Retrying (Retry ...
- go实例之线程池
go语言使用goroutines和channel实现一个工作池相当简单.使用goroutines开指定书目线程,通道分别传递任务和任务结果.简单的线程池代码如下: package main impor ...
- C#创建对象时各种初始化属性、字段的方式的执行顺序
创建对象代码如下: new FilterInfo(Student.CreateTimeProperty,"朱七",Express.Equals,Relationship.Or) { ...
- ORACLE的锁机制
数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据 ...
- Qt编写QUI皮肤生成器
用Qt写项目写多了,为了满足不同客户的需求,需要定制不同样式的界面,QUI皮肤生成器应运而生.思考这个工具的架构花了一年时间,如何从复杂的配色方案中提取出共性,然后将共性转为具体的QSS文件.思考架构 ...
- Mobiscroll的介绍【一款兼容PC和移动设备的滑动插件】
Mobiscroll是一个用于触摸设备的日期和时间选择器,它的使用不会改变HTML5.PhoneGap以及混合应用的原生用户体验.作为一款jQuery滑动选择插件,用户可以自定义主题样式,为自己的移动 ...
- powerdesigner的使用
前言 做过建模和设计的人都知道,powerdesigner是个强大实用的工具:采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术.本文档 ...
- [HNOI2008]Cards
题目描述 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案. 进一步,小春要求染出Sr张红色,Sb张蓝 ...
- Python学习_07_错误、异常
地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Py ...