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 ...
随机推荐
- 盘点selenium phantomJS使用的坑
参考:http://www.jianshu.com/p/9d408e21dc3a http://www.cnblogs.com/luxiaojun/p/6144748.html 豆瓣应该是ip被封 ...
- 工作随笔——Golang interface 转换成其他类型
新的公司,新的氛围.一年了,打算写点什么.so,那就写google的golang语言吧. 最最最基础的语法结构见go语言菜鸟教程 接下来写点菜鸟教程没有的. go语言的设计者认为:go语言必须让程序员 ...
- C# 委托详解(一)
1.委托简单例子 class eeProgram { // 声明delegate对象 public delegate string CompareDelegate(int a, int b); // ...
- VMware的一些总结
一.虚拟主机联网的三种方式: 1.仅主机(Host Only),虚拟主机只能与宿主机联网通信,无法访问外网和宿主机所在局域网的其它主机. 2.桥接(Bridge),在桥接模式下,虚拟主机就像是宿主机所 ...
- xamarin android listview的用法
listview也许是用的非常频繁的一个控件之一,下面我写一个xamarin的listview栗子,大家尝一尝xamarin android开发的乐趣.原谅我的大小写吧. listview绑定自定义的 ...
- 3、树莓派的配置:改静态IP、连接ssh、安装中文字体、安装谷歌输入法、增加USB电流、修改触摸屏分辨率、扩展sd卡空间、修复vi和vim乱码问题、安装配置远程桌面vnc
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.连接上HDMI线,插上触摸屏,插上键盘,鼠标,网线,启动.系统正常启动,但是一直闪烁,不停的黑屏,是由于触摸屏的usb口供电不 ...
- 关于模拟登陆微博(PC)
微博模拟登陆 1.基类对象的方法建立一个类__init__初始化方法,接收username和password. class launcher(): def __init__(self, usernam ...
- 【转】搭建spark环境 单机版
本文将介绍Apache Spark 1.6.0在单机的部署,与在集群中部署的步骤基本一致,只是少了一些master和slave文件的配置.直接安装scala与Spark就可以在单机使用,但如果用到hd ...
- DBA之路
对于一个励志要成为DBA的人,虽然还有不足,梦想还是要有的,万一实现了呢.做一个关于DBA成长之路的相关目录,作为灯塔. --------------------------------------- ...
- Python sort方法
官方文档: sort(*, key=None, reverse=False) This method sorts the list in place, using only < comparis ...