欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-20 17:23:16
...

技巧一:

在写工具类的时候,要加入一个私有的构造方法,这样做的目的是防止其他人通过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());
	}
}
相关标签: java基础