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());
    }
}