java—使一组函数都返回唯一的值,而不使用硬编码数字?
我有一组函数,我希望每个函数返回一个不同的素数。我不在乎哪个函数返回哪个素数,但它们必须是不同的 我想做的是写一些类似于:java—使一组函数都返回唯一的值,而不使用硬编码数字?,java,preprocessor,return-value,Java,Preprocessor,Return Value,我有一组函数,我希望每个函数返回一个不同的素数。我不在乎哪个函数返回哪个素数,但它们必须是不同的 我想做的是写一些类似于: return #uniquePrime#; 然后当我编译代码时,将所有这些转换成实际的数字 这可能吗?或者类似的效果?(除了硬编码一组素数) 谢谢 没有预处理器的解决方案:您可以编写一个返回素数的函数。例如getPrime()。每个函数都可以调用此方法来接收素数。如果getPrime()只返回每个数字一次,则这些数字将是唯一的。您可以将这些数字存储在映射或字段中,以获取该
return #uniquePrime#;
然后当我编译代码时,将所有这些转换成实际的数字
这可能吗?或者类似的效果?(除了硬编码一组素数)
谢谢 没有预处理器的解决方案:您可以编写一个返回素数的函数。例如getPrime()。每个函数都可以调用此方法来接收素数。如果getPrime()只返回每个数字一次,则这些数字将是唯一的。您可以将这些数字存储在映射或字段中,以获取该方法的相应数字
int getANumber() {
if(value1 == null)
value1 = getPrime();
return value1;
}
int getASecondNumber() {
if(value2 == null)
value2 = getPrime();
return value2;
}
但是为什么要这样做呢?使用单例素数生成器,并从每个类中的静态块调用它:
class Foo {
private static final int PRIME;
static {
PRIME = PrimeNumberGenerator.getInstance().nextPrime();
}
public int getPrime() {
return PRIME;
}
}
素数生成器留给您作为练习。但是如果素数的数量很小,使用一组固定的数字来实现它是最简单的解决方案
或者类似的效果
虽然我不明白你为什么要这么做。你可以创建一个
方法nexttime(“methodName”)
创建素数并将其注册到HashMap
中,其中String是作为参数接收的方法名,Integer存储素数。如果再次调用该方法,则可以查找素数是否已计算并返回它。您可以检查HashMap以查看质数是否已用于另一个方法
而不是return#uniquePrime#代码>
您将返回nexttime(“methodName”)代码>如果您想在测试环境中生成大量类似的方法,可以使用方法签名或行号作为输入数据。
例如
小心点。此代码存在性能泄漏。有几种方法可以攻击此漏洞。作为一个类中的函数集合是相当困难的。不过,有一个小小的变体可以很好地工作:使用函数对象而不是函数。Java中的内置版本是和接口。以下是一个自主开发的变体,以及一个支持类的概要:
/** 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());
}
}
函数
数组的每个元素将从其调用
方法返回不同的int值。这也可以使用可调用接口来完成,但这需要使用整数值而不是整数。Java没有预处理器。你在使用哪种第三方预处理器?你要求做的没有任何意义——要么你没有很好地分析和分解你的问题,要么这是一个家庭作业。你能描述一下你想解决的问题吗?@JKK:你的设计被破坏了。与其尝试将解决方案破解成一种语言,不如重新思考您的设计。你认为函数中的唯一素数能解决什么问题?Ted Hopp-我只是在使用标准编译器,并且相当确定它没有任何形式的预处理器,但希望我错了:-)@BillK和StefanKendall-这是在为一些机器学习研究编写代码时提出的。每个函数都是一个单独的特性,每个函数都返回一个唯一的素数,因为我将为每个特性和任何特性组合(通过乘法)提供简单的唯一ID。还有其他选择(包括使用的数量和实现方法),但我不知道如何在Java中实现这种方法,所以我想在这里问一下。如果代码是多线程+1,请不要忘记同步NextTime方法,这是一个很好的解决方案!我赞成使用一个固定的素数列表的建议,因为计算它们会很昂贵。你可以盗取网络中已知素数的列表,最多可以盗取非常高的值;只是把它们放在一个常量、一个文件或其他东西中……遗憾的是,这不太适合我的需要,因为我希望为一组方法,而不是一组计算,找到一个唯一的素数。当然,我可以有静态变量,每个方法一个,但在这种情况下,我也可以将它们硬编码为一组唯一的素数。不过还是要谢谢你!看起来不错-唯一的缺点是我假设这不会被编译出来,所以会有轻微的性能成本(尽管从我收集到的评论来看,这在Java中是不可能的)。谢谢谢谢-这符合上面的建议。至于我为什么要这么做,请看我上面的评论。很酷,我可以看到在将额外信息与功能关联方面的其他潜在优势。
/** 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());
}
}