我有一组函数,我希望每个函数返回一个不同的素数。我不关心哪个函数返回哪个素数,但它们必须都是不同的。
我希望能够做的事情是:
return #uniquePrime#;
然后在编译代码时将所有这些转换为实际数字。
这可能吗?或者具有类似效果的东西? (除了对一组素数进行硬编码)
谢谢!
答案 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中的内置版本是Runnable和Callable接口。这是一个本土变体,以及支持类的轮廓:
/** 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。