2013-01-05 1 views
3

여러 클래스에서 사용할 임의의 int 값을 생성하려고합니다. 이 클래스의 새로운 인스턴스 세트를 생성 할 때마다이 새로운 임의의 int 값을 이들 모두에 사용하기를 원합니다. 그래도 랜덤 값은 같아야합니다.여러 클래스에서 무작위 값을 어떻게 나누겠습니까?

간단히 말하면, 데이터를 생성하기 위해 함께 작동하는 여러 클래스에 걸쳐 생성되고 사용되는 임의 색인을 갖고 싶습니다.

이 무작위 값은 스택 맨 위에서 생성되고 함께 작동하는 각 클래스 내에서 정적으로 호출해야합니까?

답변

6

난수 값이있는 입력란을 포함하는 클래스를 만드십시오. 이 메소드에 액세스하려면 getter 메소드를 제공하십시오. 그런 다음이 클래스의 새 인스턴스를 각 클래스의 새 배치와 공유하십시오.

예.

private static final Random random = new Random(); 
private final int randomValue = random.nextInt(); 

... 

public int getRandomValue() { 
    return randomValue; 
} 

이렇게하면, 난수는 각 클래스 그룹마다 동일하지만 각 그룹마다 다릅니다.

+0

AOL 케이스 수도원입니다 이온은 상수에 사용되며, '랜덤'은 그렇지 않습니다. –

+0

굉장! 이것은 매우 도움이됩니다! 클래스 그룹의 모든 새 인스턴스를 생성하는 클래스가 하나 있으면 어떻게됩니까? 그 수업 내에서이 같은 시나리오를 만들어야합니까? –

+0

@ TomHawtin-tackline 정확하게 상수를 정의하는 방법에 따라 달라집니다. 오브젝트 상태가 변경 가능할지라도 오브젝트 참조의 값이 동일하게 유지되는 한이를 Java의 "정적 최종"과 동일하게 만드는 것이 일반적입니다. (C++에서,'const *''const *'의 차이점) – millimoose

1

그것은 Math.PI로 등 예를 들어, 같은 작품이

static class Utility { 
    private static final int variable = (int)Math.round(1000*Math.random()); 

     public static int getVariable() { 
      return variable; 
     } 
} 

같은 무엇에 대해

System.out.println(Utility.getVariable()); 
+1

단위 테스트가 어렵습니다. 가방이라면. –

1

그냥 자신의 생성자에서 관련 개체에 전달할 :

class Main { 
    public static void main() { 
     Random rnd = new Random(); 
     for (...) { 
      int index = rnd.nextInt(); 
      // one set of related instances 
      Foo f = new Foo(index); 
      Bar b = new Bar(index); 
     } 
    } 
} 

class Foo { 
    int randomIndex; 
    public Foo(int randomIndex) { 
     this.randomIndex = randomIndex; 
     // etc. 
    } 
} 

class Bar { ... } 

당신이 값 (그들은 동시에 여부가 있는지 여부) 클래스의 인스턴스간에 다를 수하고자하는 경우, 돈 ' 그것을 정적 인으로 만들지 마십시오.

1

먼저 각 그룹과 관련된 메타 데이터를 개최 전용 클래스를 사용하여 당신에 대해 얘기 "그룹"의 개념을 구체화 :

class Group 
{ 
    private int index = -1; 

    public Group(int index) 
    { 
     this.index = index; 
    } 

    public int getIndex() 
    { 
     return index; 
    } 
} 

그런 다음 각 클래스의 그룹 정보 데이터를 할당

.

각 개체의 인스턴스가 생성되기 전에 색인을 알고 있다면 생성자를 사용하십시오. 팩토리 패턴은 인스턴스화 프로세스가 복잡 할 경우 캡슐화하는 데 도움이 될 수 있습니다.

당신이 경우 전용 방법 사용에 대한 액세스 권한이 여전히 후자 알고있는 경우 : 각 인스턴스를 요청할 것입니다 : 당신이 인스턴스에 액세스 할 수없는 경우

public void assignToGroup(Group group) 

더 이상 당신이 몇 가지 간단한 반전을 사용할 수를 그 그룹 : 외부 메소드

getMyGroup(this) 

는 :

public Group getMyGroup(MyClass instance) 
{ 
    // ... some complex logic to determine the right group based on the instance state ... 
} 
관련 문제