如何写出一个优雅的代码第二集~技巧篇

技巧一:

在写工具类的时候,要加入一个私有的构造方法,这样做的目的是防止其他人通过new的方式来创建对象,保证了整个全局中对象的唯一性,也就是单例。
 

技巧二:

在一个方法内部,有时候需要创建局部变量,这时候我们尽量用基本数据类型,下面的例子就是,对一个数进行累加。如果是用包装类型Long定义变量,它的使用效率是使用基本数据类型long的10倍。
 

public class Sum {
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		long sum = 0L;//new出对象了(21亿个)
		for (long i = 0; i < Integer.MAX_VALUE; i++) {//21亿次
			sum += i;
		}
		System.out.println(sum);
		System.out.println("spend time:"+(System.currentTimeMillis()-start)+"ms");
	}
}


 

技巧三:

复合胜过继承

下面有一个需求,在往一个集合中添加数据的时候, 每次添加一个数据,就会在计数器中增加一个数,以此记录一共增加了多少次,那么第1种方式是通过继承的方式首先继承了HashSet类。然后重写了里面的add方法和addall方法。在进行数据添加的时候,设置一个成员变量,然后对这个成员变量每增加一次,添加一个数。但是其运行结果是不准的,因为这种通过继承的方式来实现技术,他有时候导致对这个继承类的结构进行改变,比如说。在调用addall的方法的时候,它的底层可能再次会调用add方法,这个时候技术是不准确的。

正确的方式应该是,使用复合的方式,也就是创建一个类,然后把这个集合按照以成员变量的方式设置进去,作为一个属性,然后再给这个集合添加数字的时候,创建一个成员变量addcount,在往集合添加数的时候对addcount进行累加,这时候得出的数据是准确的。这种方式并没有改变集合的内部逻辑。
下面是错误的案例:

/*
 *优先使用复合胜过继承
 * 继承类:统计增加的个数
 */
public class ExtendsHashSet<E> extends HashSet<E> {

	private int addCount = 0;//计数器(每加一个元素就+1)

	public ExtendsHashSet() {
	}

	public ExtendsHashSet(int initCap, float loadFactor) {
		super(initCap, loadFactor);
	}

	@Override
	public boolean add(E e) {
		addCount++;
		return super.add(e);
	}

	@Override
	public boolean addAll(Collection<? extends E> c) {
		addCount += c.size();
		return super.addAll(c);
	}

	public int getAddCount() {
		return addCount;
	}

	public static void main(String[] args) {
		ExtendsHashSet<String> s = new ExtendsHashSet<String>();
		s.addAll(Arrays.asList("King", "Mark", "Deer"));
		System.out.println(s.getAddCount());
	}
}

下面是正确的案例:

package ch07.p7;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/*
 *优先使用复合胜过继承
 * 复合类
 */
public class CompHashSet<E>{
	private final Set<E> s;
	private int addCount = 0;//特殊需求:元素个数

	public CompHashSet(Set<E> s) {
		this.s = s;
	}
	//添加一个元素
	public boolean add(E e) {
		addCount++;
		return s.add(e);
	}
	//添加一组元素
	public boolean addAll(Collection<? extends E> c) {
		addCount += c.size();
		return s.addAll(c);
	}

	public int getAddCount() {
		return addCount;
	}

	public static void main(String[] args) {
		CompHashSet<String> s = new CompHashSet<String>(new HashSet<String>());
		s.addAll(Arrays.asList("King", "Mark", "Deer"));
		System.out.println(s.getAddCount());
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值