我纯粹是出于娱乐目的而编写以下代码,可能仍然存在错误,或者甚至根本不起作用:
public class PrimeGenerator implements PrimitiveIterator.OfInt {
private final static IntNode HEAD_NODE = new IntNode(2); //error here
private IntNode lastNode = HEAD_NODE;
private int current = 0;
@Override
public boolean hasNext() {
return true;
}
@Override
public int nextInt() {
if (lastNode.value == current) {
lastNode = lastNode.next;
return lastNode.value;
}
while (true) {
current++;
if (isPrime(current)) {
break;
}
}
appendNode(current);
return current;
}
private boolean isPrime(final int number) {
PrimeGenerator primeGenerator = new PrimeGenerator();
int prime = 0;
while (prime < number) {
prime = primeGenerator.nextInt();
if (number % prime == 0) {
return false;
}
}
return true;
}
private void appendNode(final int value) {
couple(lastNode, new IntNode(value));
}
private void couple(final IntNode first, final IntNode second) {
first.next = second;
second.previous = first;
}
private class IntNode {
public final int value;
public IntNode previous;
public IntNode next;
public IntNode(final int value) {
this.value = value;
}
}
}
对于不熟悉Java 8的人们,不用担心,
PrimitiveIterator.OfInt
与Iterator<Integer>
的工作原理相同。我遇到的问题在第二行,即:
private final static IntNode HEAD_NODE = new IntNode(2);
我得到警告:
non-static variable this cannot be referenced from a static class
。我已经搜索过,应该可以通过使
IntNode
不依赖于PrimeGenerator
并通过将其移到其自己的公共类中来进行修复。但是,如果我不想公开
IntNode
,该怎么办? 最佳答案
您应该将您的IntNode
类设置为static
。
如果不这样做,这意味着IntNode
实例在不存在封闭类的实例的情况下将不存在。
简而言之,您不能写(当然,前提是IntNode
是public
):
new PrimeGenerator.IntNode(whatever);
但是您必须创建一个新的
PrimeGenerator
,在下面说generator
并输入:generator.new IntNode(whatever);
但是,您在这里尝试创建
IntNode
作为PrimeGenerator
的类变量。这将不起作用,因为您还没有PrimeGenerator
实例。