сделать набор функций все возвращают уникальные значения без жесткого кодирования чисел? - PullRequest
2 голосов
/ 17 октября 2011

У меня есть набор функций, и я бы хотел, чтобы каждая из них возвращала различное простое число. Мне все равно, какая функция возвращает какое простое число, но все они должны быть разными.

Что я хотел бы сделать, так это написать что-то вроде:

return #uniquePrime#;

И затем все они преобразуются в реальные числа, когда я компилирую код.

Возможно ли это? Или что-то с похожим эффектом? (кроме жесткого кодирования набора простых чисел)

Спасибо!

Ответы [ 5 ]

2 голосов
/ 17 октября 2011

Используйте одноэлементный генератор простых чисел и вызовите его из статического блока в каждом классе:

class Foo {
    private static final int PRIME;

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

    public int getPrime() {
        return PRIME;
    }
}

Генератор простых чисел оставлен вам в качестве упражнения.Но если число простых чисел невелико, использование фиксированного набора чисел для реализации является самым простым решением.

1 голос
/ 17 октября 2011

Если у вас есть цель генерировать огромное количество похожих методов в тестовой среде, вы можете использовать сигнатуру метода или номер строки в качестве входных данных.Например,

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

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

Будьте осторожны.Этот код имеет утечку производительности.

0 голосов
/ 25 октября 2011

Есть несколько способов атаковать это.Это довольно сложно сделать как набор функций в одном классе.Небольшой вариант, однако, может работать довольно хорошо: использовать функциональные объекты вместо функций.Встроенными версиями этого в 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 будет возвращать значение типа int, отличное от его метода call.Это также можно было бы сделать с помощью интерфейса Callable, но для этого потребовалось бы использовать целочисленные значения вместо целых.

0 голосов
/ 17 октября 2011

Или что-то с похожим эффектом?

Хотя я не понимаю, почему вы хотите это сделать.Вы можете создать

метод nextPrime("methodName"), который создает простое число и регистрирует его в HashMap<String,Integer>, где String - имя метода, полученное в качестве аргумента, а Integer хранит простое число.Если метод вызывается снова, вы можете посмотреть, было ли вычислено простое число, и вернуть его.Вы можете проверить HashMap, чтобы увидеть, использовалось ли простое число для другого метода.

Вместо return #uniquePrime#;

вы бы return nextPrime("methodName");

0 голосов
/ 17 октября 2011

решение без препроцессора: вы можете написать функцию, которая возвращает простые числа.что-то вроде getPrime ().каждая функция может вызывать этот метод для получения простого числа.если getPrime () возвращает каждое число только один раз, числа будут уникальными.Вы можете хранить числа на карте или в полях, чтобы получить соответствующий номер для метода.

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

но почему вы хотите это сделать?

...