2014-09-15 2 views
2

해당 클래스의 모든 개체에 대해 고유 한 int 멤버가있는 클래스를 만들어야합니다. 그래서 : 나는 Cls 객체의 X 번호를 할 때고유 한 식별 번호를 사용하여 클래스 구현

public class Cls { 
    private int id; 
    public Cls(){id = unique number;} 
} 

그래서, 나는 더 클래스 ID가 같은 없는지 확인해야합니다. 하지만 메인에서 글로벌 변수를 만들고, ID를 하나씩 설정하는 것을 피하고 싶습니다. 가능한 경우 ID를 생성자에서 설정할 수 있으면 좋을 것입니다.

답변

5

마지막으로 사용한 값을 포함하는 static 값을 잡고 사용할 때마다 늘리십시오. AtomicInteger은 스레드 안전성이 있고 다중 스레드 환경에서 사용할 경우 잠금을 필요로하지 않기 때문에이 기능이 뛰어납니다.

public class Cls { 
    // The last id I used. 
    private static final AtomicInteger nextId = new AtomicInteger(); 
    // My id 
    private final int id = nextId.getAndIncrement(); 

    public Cls() { 
    } 
} 
+0

메모리 장벽을 도입합니다. – Basilevs

+0

@Basilevs - 예, 그렇습니다. 그것이 스레드로부터 안전합니다. – OldCurmudgeon

2

정적 변수를 사용하고 증가 :

public class Cls { 

    private static int count = 0; 
    private int id; 

    public Cls() { 
     id = count; 
     count++; 
    } 
} 

첫번째 목적은 id = 0을 갖 등

제한id = 1있을 것이다 번째,이 방법은 간단 하나, 하지만 많은 스레드를 사용하는 응용 프로그램을 원한다면 작동하지 않습니다.


멀티 스레딩

당신이 멀티 스레딩 컨텍스트에있는 경우, 당신은 당신이 어떤 예상되는 결과를 가지고 있는지 확인해야합니다. 몇몇 가능한 방법 :

public static synchronized void incrementCount() { 
    count++; 
} 
:

1) java.util.concurrent.atomic에서 클래스를 사용하여 (예 AtomicInteger)() OldCurmudgeon에 따른

2) 대신 count++의 구조는 다음 동기화 메소드를 호출

3) 동기화를 위해 추가 개체를 사용하십시오.

private static final Object lock = new Object(); 

public void increment() { 
    synchronized(lock) { 
     count++; 
    } 
} 
+2

가능하지만 그러한 코드는 다중 스레드 환경에서 실패합니다. Cls의 모든 인스턴스가 고유 한 ID를 가지고 있다는 보장은 없습니다. – jarnbjo

+0

또한 멀티 스레딩 컨텍스트에 대한 세부 정보도 추가했습니다. 고맙습니다! –

0

해당 인덱스의 고유성을 관리하는 주변 구조를 만들거나 UUID를 사용할 수 있습니다. UUID는 여전히 충돌 가능성이 매우 낮지 만, 소량의 데이터에는 문제가 없어야합니다.

+0

"small"은 어떻게 정의합니까? – jarnbjo

+0

숫자에 대한 [this] (http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates)를 참조하십시오. – Dreizehn

+0

나는 * * * *를 작게 정의 해달라고 요청했습니다. – jarnbjo

0

당신은 UUID

String uniqueID = UUID.randomUUID().toString(); 
4

UUID 클래스는 고유 ID를 생성하는 간단한 방법을 제공 할 수 있습니다.

import java.util.UUID; 

public class GenerateUUID { 

    public static final void main(String... aArgs){ 
    UUID uniqueID = UUID.randomUUID(); 
    log("unique ID: " + uniqueID); 
    } 

    private static void log(Object aObject){ 
    System.out.println(String.valueOf(aObject)); 
    } 
} 

read more

0

그것은 숫자 UID해야합니까? 또한 jvm에서 고유하거나 모든 앱 실행에서 고유 한 것을 찾고 계십니까? 실시간 개체 또는 앱 전체에서 유일무이 한 기능을 찾고 계십니까?

제한된 답변 세트 (아니요, jvm에서만 라이브 개체에만 해당)의 경우 가장 간단한 방법은 개체의 개체 ID를 사용하는 것입니다. 그러나 이것은 숫자가 아니며, 객체가 죽은 후에 재사용 될 수 있습니다. 그러나 당신은 무료로 독창성을 얻습니다.

관련 문제