2016-01-13 4 views
1

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

import java.util.Random; 
public class RandomNumbers { 

Random rand = new Random(); 

public int random() { 
    int result; 
    result = rand.nextInt(100) + 1; 
    return result; 
} 

public int topNumber(int firstTopNumber){ 
    int result; 
    result = rand.nextInt(firstTopNumber) + 1; 
    return result; 
} 

Вместо этого:

import java.util.Random; 
public class RandomNumbers { 

public int random() { 
    int result; 
    Random rand = new Random(); 
    result = rand.nextInt(100) + 1; 
    return result; 
} 

public int topNumber(int firstTopNumber){ 
    int result; 
    Random rand = new Random(); 
    result = rand.nextInt(firstTopNumber) + 1; 
    return result; 
} 
+0

Ваш первый сценарий не использует «глобальный» объект (в Java нет переменных глобальной области), но он не должен постоянно восстанавливать новый объект «Случайный» каждый раз, когда вам нужно число. Поэтому я предпочитаю его второму сценарию. –

ответ

1

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

class RandomNumbers { 
    private final static Random r = new Random(); 

    public static int topNumber(int firstTopNumber) { 
    return r.nextInt(firstTopNumber) + 1; 
    } 
} 

ума, что переменный разделенный между несколькими методами (static или нет), не всегда хорошо, в этом случае у вас есть объект без состояния (на самом деле он имеет состояние, но это не имеет значения), поэтому использование его из любого метода не является проблемой, но это не всегда так ,

0

Перед использованием переменной-члена необходимо проверить следующее.

  1. Тип переменной экземпляра должен быть потокобезопасным (Random - поточно-безопасный) или методы доступа или должны быть синхронизированы.

2.Cross проверить документ API. См. Приведенную ниже цитату от https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

Экземпляры java.util.Random являются потокобезопасными. Однако одновременное использование одного и того же экземпляра java.util.Random через потоки может столкнуться с конкуренцией и, как следствие, низкой производительностью. Вместо этого используйте ThreadLocalRandom в многопоточных проектах.

Смежные вопросы