2015-09-03 5 views
0

В то время как я работал над классом, который требовал генерации случайных чисел, я думал о способе создания только одного случайного объекта для нескольких целей.Как создать один объект для нескольких целей правильно?

Я прочитал о статических фабриках в эффективной Java и придумал это, но чем больше я думаю, тем меньше логики я вижу в этом. Это лучший способ? И это гарантирует, что создается только один случайный объект?

public static Random newInstance() { 
    return new Random(); 
} 

public static void generateRandom() { 
    Random rand = newInstance(); 
    //... 
} 

Другой способ инициализируется его в конструкторе, хотя я не уверен, что это лучшая практика?

public static Random rand = new Random(); 
+0

Я бы рекомендовал '' SecureRandom' над Random' – Kirby

+0

Второй вариант кода не будет инициализировать в конструкторе, который будет инициализироваться при загрузке класса. –

+0

Я думал, что он сделал конструктор автоматически, если его нет? – SJ19

ответ

2

public static final SecureRandom rand = new SecureRandom(); будет лучшим способом пойти.

Каждый раз, когда вы вызываете свой newInstance(), вы собираетесь создать новый объект, который накладывает накладные расходы и начинается с нового семени.

В вашем generateRandom() ваш экземпляр rand будет локальным для области действия этого метода, что может быть лучшим решением, если для этого метода нужен только генератор случайных чисел. Это зависит от того, что еще вы делаете.

Я стараюсь использовать статические заводы для случаев, когда существует более сложная или дорогая логика, чем просто создание объекта. Предположим, вы собираетесь построить объект, а затем прочитать некоторые файлы с диска и загрузить эти данные в объект. Это было бы полезно сделать на статической фабрике, потому что вы можете указать некоторые исключения, которые могут возникнуть (IOException), и обычно не ожидается, что конструктор - дорогостоящая операция, включающая что-то вроде чтения файлов.

What are static factory methods?

+0

Не могли бы вы объяснить, что такое точка статических фабрик? Я пытаюсь использовать их, но я еще не нашел хороший способ использовать его, так как большинство раз, когда я могу просто инициализировать, сразу? – SJ19

+1

Статические методы фабрики - это путь, когда у вас есть более одного конструктора для объекта, и вы хотите каким-то образом их отличить - методы, в отличие от конструкторов, имеют имена. – MirMasej

+0

Согласен, @MirMasej – Kirby

1

Если ваше приложение однопоточно, чем да, это прекрасно, чтобы использовать singleton pattern без синхронизации, другого то, что для многопоточных сред, если вы хотите один экземпляра, чем нужно синхронизировать в вашем newInstanceMethod или вы можете объявить константу private static final Random = new Random() а также возвращение это от вашего staticnewInstance способ.

Обратите внимание, что Random класса поточно и не нужно беспокоиться о безопасности потока, но вы должны следовать одноплодному шаблону правильно, чтобы сделать ваше приложение может иметь одного Object во время выполнения в многопоточной среде.

И это гарантирует, что создается только один случайный объект?

В настоящее время вы каждый раз возвращаете новый экземпляр. Если вам нужен только один экземпляр, который у вас есть.

private static final Random RANDOM = new Random() 

public static Random newInstance() { 
    return RANDOM; 
} 
Смежные вопросы