2012-09-23 3 views
2

제한하고 싶습니다. (Java에서) 클래스의 직접적인 인스턴스의 경우, n에, 즉 언제든지 클래스의 직접 객체가 메모리에 n 개 이상 존재하지 않는다고 말합니다. 그러나 아니오에 그러한 제한이 없습니다. 이 클래스의 서브 클래스와 같은 간접 객체 자바에서 이것을 달성 할 수있는 방법이 있습니까?한도 번호. Java 클래스의 인스턴스를

+5

이러한 요구 사항의 비즈니스 사례를 알고 싶어합니다. – Vikdor

+0

네가 궁금한 점이 왜 그렇게 필요한지. Java는이를 위해 설계되지 않았습니다. 내가 생각할 수있는 두 가지 방법은 인스턴스가 공개 될 때 계산할 수 있도록 허용 할 것이지만 둘 다 매우 권장하지 않습니다. – Dunes

+0

인스턴스를 계산하는 특별한 플러그인으로 jvisualvm을 시작하면 이런 종류의 작업을 수행 할 수 있을지 궁금합니다. 아마도 어리석은 생각이지만 기술적으로 가능합니까? –

답변

0

당신은 할 수 있습니다 :

static final AtomicInteger count = new AtomicInteger(); 

// in your parent constructor. 
if (getClass() == Parent.class && count.incrementAndGet() >= LIMIT) 
    throw new IllegalStateException(); 
+0

이것은 출시 된 인스턴스에 대한 설명이 아닙니다 –

+0

메인 클래스의 finalize 메소드를 오버라이드하는 것과 함께 메인 생성자 내부에서 이것이 작동해야한다고 생각합니다. 감사. –

3

인스턴스를 사용하면 인스턴스가 제한을 초과하는 경우 예외를 던집니다.

http://www.oodesign.com/factory-pattern.html

아래 거친 샘플 구현입니다.

public class AnyClass { 
    private static final int limit_ = 8; 
    private static int count = 0; 

    private AnyClass() {} 

    public static synchronized AnyClass getInstance() { 
     if (count < limit_) { 
      AnyClass anyClass = new AnyClass(); 
      count++; 
      return anyClass; 
     } 
     return null; 
    } 
} 
+0

직접 생성을 통해 공장을 우회하는 것을 막기 위해 생성자를 비공개로 설정하는 것을 잊지 마십시오. – JTMon

+1

릴리스 된 인스턴스를 고려하지 않습니다. –

+0

릴리스 된 인스턴스에 대한 재정의를 위해 재정의합니다. –

0

자바는 기본적으로 이러한 가능성을 제공하지 않습니다.

나는 풀링 된 팩터 리로 직접 또는 클래스 생성자에서 직접 관리 할 수 ​​있다고 생각합니다. INSTANCES> MAX_LIMIT 인 경우 생성자에서 static 카운터 INSTANCES (클래스의 비공개 숫자로 정의 됨)를 확인한 다음 예외를 throw합니다. 나는이 일을 생각

+0

이것은 출시 된 인스턴스를 고려하지 않습니다. –

0

는 (사용 사례를 모르고) 나쁜 생각이지만, 어쨌든 ...

당신은 그 클래스의 생성자에서 일부 코드를 넣어 모든 인스턴스를 셀 수 있습니다. 하위 클래스의 인스턴스를 무시해야하는 경우 getClass()에 의해 반환 된 값을 확인하십시오.

인스턴스가 해제 된시기를 알아 보려면 weak referencesWeakHashMap을 사용하여 아직 사용중인 인스턴스 수를 추정 할 수 있습니다. 가비지 콜렉션은 예기치 않은 시간에 인스턴스를 제거하기 때문에 사용중인 실제 인스턴스 수는 더 낮을 수 있습니다. 정확한 숫자의 경우 인스턴스가 더 이상 사용되지 않는다는 것을 알 때 명시 적으로 메소드를 호출해야합니다.

관련 문제