为什么java库编码如此难以理解?

时间:2016-03-23 16:45:49

标签: java performance

有时当我查看java.util类的功能时,我会看到这样的内容:

final Node<K,V> getNode(int hash, Object key) {
    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
    if ((tab = table) != null && (n = tab.length) > 0 &&
        (first = tab[(n - 1) & hash]) != null) {
        if (first.hash == hash && // always check first node
            ((k = first.key) == key || (key != null && key.equals(k))))
            return first;
        if ((e = first.next) != null) {
            if (first instanceof TreeNode)
                return ((TreeNode<K,V>)first).getTreeNode(hash, key);
            do {
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    return e;
            } while ((e = e.next) != null);
        }
    }
    return null;
}

或者这个例如:

if ((next = (current = e).next) == null && (t = table) != null) {
    do {} while (index < t.length && (next = t[index++]) == null);
}

他们倾向于在同一行中使用很多分配变量来检查其值,以及其他使代码难以阅读的内容。

我的意思是,为了阅读和理解这一点,我必须多次阅读并在脑海中分离。 但是,如果这个编码方式不同,我认为不会很难理解它。

这是因为表现吗?如果是,我在编写代码时应该这样做吗?这是常见的吗?

1 个答案:

答案 0 :(得分:3)

我认为这段代码的可读性实际上并不差。一旦你习惯了某些风格技巧(比如当你在同一行中提到一个变量的赋值,你检查一个条件),那么阅读这样的代码会更自然。

此外,由于他们正在实施的算法,一些Java库函数很难理解。例如,我怀疑任何人都能够在一次读取中理解有效的排序功能。我会说最有趣的代码需要你多次阅读才能理解它。

至于效率,我怀疑它是否有所作为。无论如何,它通常会编译成相同的指令。