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 ...
随机推荐
- margin相关
1.图片与文字对齐问题 如果图片和文字差不多大时,使用兼容性强的margin负值方法. 方法:img{margin:0 3px -3px 0;} 2.div嵌套后margin出现失效(转移)问题 原因 ...
- UILabletext去掉乱码 控制颜色 行高 自定义大小 。显示不同的字体颜色、字体大小、行间距、首行缩进、下划线等属性(NSMutableAttributedString)
text去掉乱码 设置不同颜色 行高 自定义大小 #import <Foundation/Foundation.h> @interface TextsForRow : NSObject @ ...
- MySQL操作时间的函数集
求两个Timestamp之间的秒差值: select TIMESTAMPDIFF(SECOND,TIMESTAMP("2017-03-01 07:58:20"),timestamp ...
- Time Complexity of Loop with Powers
以下功能的时间复杂度是多少? void fun(int n, int k) { for (int i=1; i<=n; i++) { int p = pow(i, k); for (int j= ...
- 我是如何确认线上CLOSE_WAIT产生的原因及如何解决的。
1.阐述 内部架构:Tomcat应用程序---> nginx ---> 其他Tomcat应用程序,内部Tomcat应用通过nginx调用其他应用. HTTP插件:HttpClient 4. ...
- /sbin/nologin 和 /bin/false 的区别
/bin/false是最严格的禁止login选项,一切服务都不能用,而/sbin/nologin只是不允许系统login,可以使用其他ftp等服务 如果想要用false在禁止login的同时允许ftp ...
- Delete 命令详解
cp:复制文件 /cp -r:复制目录 /bin/cp -f: 复制文件并覆盖已有文件(写命令的绝对路径/bin/) /cp /ect/passwd .:将其他文件复制到当前目录 /-n :不要 ...
- Locust no-web 模式与参数详解
读前参考:<性能测试工具Locust > 熟悉 Apache ab 工具的同学都知道,它是没有界面的,通过命令行执行. Locust 同样也提供的命令行运行,好处就是更节省客户端资源. 命 ...
- Python中range()和len()
- C语言学生管理系统(原版本)(自编)
/*系统特色:(大牛勿笑) *颜色提示 *文字提示 *功能 */ #include <stdio.h> #include <stdlib.h> #include <mat ...