java的类修饰符

    在编写Java类或接口时,要考虑使用哪种修饰符,有public和和包级私有修饰符号,经验表明,应该使类的可访问能力最小化。看下面的例子:

/**
 * 栈的接口
 * 
 */
public interface MyStack {

	/**
	 * 获取栈中数据的个数
	 * 
	 */
	int size();

	/**
	 * 测试栈是否为空
	 * 若栈空,返回true,否则false
	 */
	boolean isEmpty();

	/**
	 * 向栈顶部压入元素o
	 * 
	 */
	void push(Object o);

	/**
	 * 弹出栈顶部元素
	 * 若栈空,抛出EmptyStackException异常
	 */
	Object pop() throws EmptyStackException;

	/**
	 * 获取栈顶部元素
	 * 若栈空,返回null
	 */
	Object getTop();

}

class MyStackImpl implements MyStack {
	private Object[] elements;
	private int size = 0;

	public MyStackImpl(int initialCapacity) {
		this.elements = new Object[initialCapacity];
	}

	public void push(Object e) {
		ensureCapacity();
		elements[size++] = e;
	}

	public Object pop() {
		if (size == 0)
			throw new EmptyStackException();
		Object result = elements[--size];
		elements[size] = null;
		return result;
	}

	public boolean isEmpty() {
		return (size == 0 ? true : false);
	}

	public Object getTop() {
		if (size == 0)
			return null;
		return elements[size - 1];
	}

	public int size() {
		return size - 1;
	}

	public String toString() {
		StringBuffer b = new StringBuffer();

		for (int i = 0; i < size; i++) {
			b.append(elements[i] + " ");
		}

		String s = new String(b);
		return "[" + s + "]";
	}

	private void ensureCapacity() {
		if (elements.length == size) {
			Object[] oldElements = elements;
			elements = new Object[2 * elements.length + 1];
			System.arraycopy(oldElements, 0, elements, 0, size);
		}
	}
}

    这里MyStack和MyStackImpl是在同一个包中的,可以看到MyStack是用public修饰的,而MyStackImpl则是包级私有的。这样做是有好处的,如果一个包是一个模块,那么对外只要显示public类和接口就可以了,而包级私有的类就相当于包的实现,在以后的发行版本中,你可以修改,替换(比如我现在的MyStackImpl,哪天觉得那个实现不够好,可以对它进行修改,而不会影响到客户的代码)。

 

你可能感兴趣的:(java)