java - 制作一组函数都返回唯一值而没有硬编码数字?

时间:2011-10-17 18:36:46

标签: java preprocessor return-value

我有一组函数,我希望每个函数返回一个不同的素数。我不关心哪个函数返回哪个素数,但它们必须都是不同的。

我希望能够做的事情是:

return #uniquePrime#;

然后在编译代码时将所有这些转换为实际数字。

这可能吗?或者具有类似效果的东西? (除了对一组素数进行硬编码)

谢谢!

5 个答案:

答案 0 :(得分:2)

使用单个素数生成器,并从每个类中的静态块调用它:

class Foo {
    private static final int PRIME;

    static {
        PRIME = PrimeNumberGenerator.getInstance().nextPrime();
    }

    public int getPrime() {
        return PRIME;
    }
}

素数发生器留给你作为练习。但是如果质数的数量很少,使用一组固定的数字来实现它是最简单的解决方案。

答案 1 :(得分:1)

如果您有意在测试环境中生成大量类似方法,则可以使用方法签名或行号作为输入数据。 E.g。

public int method1() {
    return primeValue();
}

private static int primeValue() {
    final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    final StackTraceElement lastElement = stackTrace[2];
    return lastElement.getLineNumber();
}

小心点。此代码有性能泄漏。

答案 2 :(得分:0)

没有预处理器的解决方案:您可以编写一个返回素数的函数。像getPrime()这样的东西。每个函数都可以调用此方法来重新接收素数。如果getPrime()只返回一次,则数字将是唯一的。您可以将数字存储在地图或字段中以获取方法的相应编号。

int getANumber() {
    if(value1 == null)
        value1 = getPrime();
    return value1;
}
int getASecondNumber() {
    if(value2 == null)
        value2 = getPrime();
    return value2;
}

但为什么要这样做?

答案 3 :(得分:0)

  

或具有类似效果的东西?

虽然我不明白你为什么要这样做。你可以创建一个

方法nextPrime("methodName"),它创建一个素数并将其注册在HashMap<String,Integer>中,其中String是作为参数接收的方法名称,Integer存储素数。如果再次调用该方法,您可以查找素数是否已经计算并返回它。您可以检查HashMap以查看素数是否已用于其他方法。

而不是return #uniquePrime#;

你会return nextPrime("methodName");

答案 4 :(得分:0)

有几种方法可以攻击它。作为单个类中的函数集合,这很难做到。但是,一个轻微的变体可以很好地工作:使用函数对象而不是函数。 Java中的内置版本是RunnableCallable接口。这是一个本土变体,以及支持类的轮廓:

/** A class that returns a sequence of unique primes. */
class PrimeNumberStream {
    private int nextIndex = 0;

    /** Return the next prime in this stream. */
    public int nextPrime() {
        return getNextPrime(nextIndex++);
    }

    private static int getNextPrime(int index) {
        // TODO - return the index-th prime number
    }
}

class UniquePrimeFunction {
    private static final PrimeNumberStream primes = new PrimeNumberStream();

    /** The prime that this function object will return. */
    private final int mPrime;

    public UniquePrimeFunction() {
        mPrime = primes.nextPrime();
    }

    public int call() {
        return mPrime;
    }
}

// Define an array of function objects, each of which returns a unique prime.
UniquePrimeFunction[] functions = {
    new UniquePrimeFunction(),
    new UniquePrimeFunction(),
    // etc.
};

public static void main(String[] args) {
    // print each function's unique prime
    for (UniquePrimeFunction func : functions) {
        System.out.println(func.call());
    }
}

functions数组的每个元素将从其call方法返回不同的int值。这也可以使用Callable接口完成,但是需要使用Integer值而不是int。