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 ...
随机推荐
- 控制反转-Ioc之Unity
本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc.在介绍的时候,会尽量结合代码来讲解一些概念. 1.什么是DI? DI即控制反转,是将对具体实现类的依赖转变为对接口的依赖,这样在编程中 ...
- IDEA使用--字体、编码和基本设置
IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...
- idea 导入项目后 有的项目目录结构不展开解决办法
如图:可能会出现这中国情况. 解决办法: 1.一般项目导入完成后,但是目录不展开, 2.出现这种情况一般情况下, 关闭idea close idea ,然后重新导入一遍就OK.
- 项目(1)----用户信息管理系统(5)---(剩余jsp界面)
完成剩余jsp界面 首页界面前面我写了,接下来还有就是一个显示所有用户界面 1:注册界面 2:显示所有用户信息界面 1:注册界面 <%@ page language="java&quo ...
- Microsoft Visual Studio 2012旗舰版(VS2012中文版下载)官方中文版
Microsoft Visual Studio 2012 Ultimate旗舰版(VS2012中文版下载)是一个最先进的开发解决方案,它使各种规模的团队能够设计和创建出使用户欣喜的引人注目的应用程序. ...
- Java多线程之赛跑游戏
在JavaSE中,多线程是一个重要的内容. 我们要了解多线程的概念,就要先了解进程的概念:要了解进程的概念,就离不开操作系统的概念. 在一台正常运行的电脑中,计算机硬件(如CPU.内存.硬盘.网卡.显 ...
- Wincc flexable的局势视图的组态
1.趋势视图介绍 2.实时趋势视图的组态 1)创建连接和变量 2)开始组态局势视图 3)设置趋势视图的属性,添加一个趋势 3.模拟运行HMI,观察局势图
- php多语言切换---转载
文件内容: /include/language.php <?php $languages = array (); $languages ['zh-cn'] ["name"] ...
- [经验分享]WebApi+SwaggerUI 完美展示接口
不喜欢说废话,直接上干货. 第一步: 打开VS IDE ,新建一个WebAPI项目 选择Web .Net FrameWork (如果喜欢使用.Net Core的可以使用.Net Core) 选择Web ...
- ubuntu环境下python虚拟环境的安装
一. 虚拟环境搭建 在开发中安装模块的方法: pip install 模块名称 之前我们安装模块都是直接在物理环境下安装,这种安装方法,后面一次安装的会覆盖掉前面一次安装的.那如果一台机器上面开发多个 ...