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 ...
随机推荐
- 「mysql优化专题」主从复制面试宝典!面试官都没你懂得多!(11)
内容较多,可先收藏,目录如下: 一.什么是主从复制 二.主从复制的作用(重点) 三.主从复制的原理(重中之重) 四.三步轻松构建主从 五.必问面试题干货分析(最最重要的点) 一.什么是主从复制(技术文 ...
- restfull软件架构风格
概念:restfull是一种软件架构风格,实现该风格不需导jar包,但要使用@PathVariable注解:特点:没有参数,没有扩展名优势: 1.安全 2.简洁高效 3.容易被搜索引擎所收录 如何利用 ...
- myeclipse无法导入项目
MyEclipse无法导入Java项目时常遇到的两种情况: 1.Some projects cannot be imported because they already exist in the w ...
- ERROR: ORA-12560: TNS: 协议适配器错误,解决办法:启动OracleServiceORCL服务
- ed命令
- 【python】字符串、列表、元组间相互转化及函数len、max、min、sum、sorted、reversed、enumerate、zip用法示例
- Hibernate学习---基本介绍+作用+配置
从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明: Hibernate的基本介绍 Hibernate的作用 Hibernate基本配置 Hibernate的 ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
- Java 读者写者问题
实验存档.V 允许好几个人同时读,但是不允许在有人读的时候写,以及同一时间只能有一个人在写. 读者.java: package operating.entity.readerwriter; impor ...
- 7.nginx伪静态规则
网上收集的一些常用的,要用的时候就仿照一下,或直接拿来用. WordPress伪静态规则 location / { index index.html index.php; if (-f $reques ...