나는 HuffmanTree를 구축하는 데 도움이 될만한 것을 찾는 웹을 찾고 있었는데이 코드를 우연히 발견했다. http://rosettacode.org/wiki/Huffman_coding#Java.Java - Tree가 Node의 인스턴스입니까?
나는 Java에 익숙하지 않고 이것을 내 수준보다 높게 사용할 수는 없지만 (그와 같은 짧고 겉으로보기에 효과적인 코드이기 때문에) 나는 여전히 흥미를 끈다. 그리고 그것을 통해 읽으려고했다. 적어도 대부분의 것을 이해하기를 바랬습니다 (참고 : 실패했습니다).
그러나 "instanceof"방법에주의를 기울이는 코드가있었습니다.
내 코드에는 3 개의 클래스가 있습니다.
한 슈퍼 클래스 (HuffmanTree)과 두 개의 서브 클래스 (HuffmanNode 및 HuffmanLeaf)과 같이 : 나는 "instanceof를"그리고 지금까지 내가 그것을 이해, 그것은 대상 여부를 알려줍니다 대해 조금 읽어
abstract class HuffmanTree implements Comparable<HuffmanTree> {
public final int frequency; // the frequency of this tree
public HuffmanTree(int freq) { frequency = freq; }
// compares on the frequency
public int compareTo(HuffmanTree tree) {
return frequency - tree.frequency;
}
}
class HuffmanLeaf extends HuffmanTree {
public final char value; // the character this leaf represents
public HuffmanLeaf(int freq, char val) {
super(freq);
value = val;
}
}
class HuffmanNode extends HuffmanTree {
public final HuffmanTree left, right; // subtrees
public HuffmanNode(HuffmanTree l, HuffmanTree r) {
super(l.frequency + r.frequency);
left = l;
right = r;
}
}
부울을 반환하는 특정 클래스의 인스턴스입니다 (true 또는 false).
논리적으로 상위는 하위의 인스턴스가 될 수 없습니다.
그러나 (tree instanceof HuffmanNode)를 쓰면 true를 반환하고 (트리는 HuffmanTree 클래스의 객체 임), 쓰면 (트리 instanceof HuffmanLeaf) false (논리적으로)를 반환합니다.
그러나 트리가 HuffmanNode의 부모 일 때 (tree instanceof HuffmanNode) true를 반환합니까?
'tree' 객체는 정적 유형의'HuffmanTree'를 가질 수 있습니다 만,'HuffmanTree'는'abstract'이므로 동적 유형 ('instanceof'가 사용하는 것)이 될 수 없습니다. –
이 패턴에주의 깊게주의하십시오. 이것은 재귀 적 정의의 엄청난 힘입니다. 이진 트리의 모든 노드는 그 자체가 이진 트리입니다. 두 개의 자식이 있기 때문입니다. 잎 노드는 아직 자식이없는 트리입니다 (아직). 따라서 트리의 모든 노드는 동시에 노드 (값을 보유하고 있음)와 트리입니다. 매우 큰 규모의 소프트웨어 개발 (심지어 수학)이이 기초 위에 놓여 있습니다. –
그러나,'instanceof'는 코드 타입의 냄새입니다. 올바른 타입 분류법 대신 너무 자주 사용됩니다. –