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 ...
随机推荐
- solr6.5搭建以及使用经验
首先搭建环境为Linux 6.5 64位 jdk1.7 将webapp目录复制到tomcat下的webapps目录下 可以修改文件夹名为solr(这个自己随意定义,项目名而已) 在tomcat目录下 ...
- OpenCASCADE 公众号
OpenCASCADE 公众号 eryar@163.com 今天也注册了一个微信公众号,以后会在微信公众号中发表OpenCASCADE学习文章,Blog会与微信公众号同步.下面是微信公众号二维码,欢迎 ...
- bootstrap表格固定表头,表格内容滚动条滚动显示
直接贴代码--- <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...
- 53、css补充
css其余问题补充 一.默认的高度和宽度问题 1.父子都是块级元素 <!DOCTYPE html> <html> <head> <title>...&l ...
- Lucene实现索引和查询
0引言 随着万维网的发展和大数据时代的到来,每天都有大量的数字化信息在生产.存储.传递和转化,如何从大量的信息中以一定的方式找到满足自己需求的信息,使之有序化并加以利用成为一大难题.全文检索技术是现如 ...
- LeetCode中的最大子串和问题(Maximum Subarray)
问题描述: Find the contiguous subarray within an array (containing at least one number) which has the la ...
- 每周.NET前沿技术文章摘要(2017-05-17)
汇总国外.NET社区相关文章,覆盖.NET ,ASP.NET等内容: .NET .NET Framework 4.7正式发布 链接: http://www.infoq.com/cn/news/2017 ...
- 转战Hexo
从之前的转战farbox,到现在又转战Hexo,真是不折腾不成魔.要说farbox有什么不好,可能唯一的不好就是它要求与Dropbox关联吧,这对于大部分国内用户来说是无法接受的,写文章之前一想到还要 ...
- Eclipse Pydev添加MySQLdb模块,Windows下安装MySQL-python
1.首先确保Windows下已经安装Python.Eclipse并且Eclipse已经集成Pydev能成功运行Python 2.下载MySQL-python 地址:http://www.codegoo ...
- MySQL 权限与用户表
1.授权时创建用户 grant all privileges on *.* to zhengwenqiang@localhost identified by 'zhengwenqiang'; 2.收回 ...