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 ...
随机推荐
- 设备指纹识别之User Agent 解析
设备指纹识别之User Agent 解析User Agent 解析 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-4- ...
- 浅析JavaScript的字符串查找函数:indexOf和search
语法 ①indexOf:方法可返回某个指定的字符串值在长字符串中首次出现的位置.如果被查找字符串没有找到,返回-1. indexOf 说明:该方法将从头到尾地检索字符串 stringObject,看它 ...
- 【二十一】基于mysqli的表格数据练习
mysqlitest.php <?php //调用数据库的函数 function connetionsql(){ $conn=mysqli_connect("127.0.0.1&quo ...
- 使用Node.js搭建一个本地服务器
let http = require('http'); //创建一个http let server = http.createServer((request,response)=>{ //创建一 ...
- iOS Swift3.0 OC 数据储存--归档
一.Swift 3.0 1.model class userModel: NSObject,NSCoding { var account: String = "" var regm ...
- iOS知识点、面试题 之二
最近面试,与大家分享一下,分三文给大家: 当然Xcode新版本区别,以及iOS新特性 Xcode8 和iOS 10 在之前文章有发过,感兴趣的可以查阅: http://www.cnblogs.com/ ...
- 基于CDH 5.9.1 搭建 Hive on Spark 及相关配置和调优
Hive默认使用的计算框架是MapReduce,在我们使用Hive的时候通过写SQL语句,Hive会自动将SQL语句转化成MapReduce作业去执行,但是MapReduce的执行速度远差与Spark ...
- [array] leetcode - 41. First Missing Positive - Hard
leetcode - 41. First Missing Positive - Hard descrition Given an unsorted integer array, find the fi ...
- vuejs实现本地数据的筛选分页
今天项目需要一份根据本地数据的筛选分页功能,好吧,本来以为很简单,网上搜了搜全是ajax获取的数据,这不符合要求啊,修改起来太费力气,还不如我自己去写,不多说直接上代码 效果图: 项目需要:点击左侧进 ...
- 微信小程序+“芝麻小客服”可设自动关注公众号,助力运营闭环
微信小程序全面上线已经接近1年的时间,从最初的"用完即走"理念到2017年总计更新开放60余次的功能创新,微信小程序不一定会爆发下一次的红利,但绝对是微信生态中重要的一环. 芝麻小 ...