itsource

Java에는 Integer, Float, Double, Long의 가변형이 있습니까?

mycopycode 2022. 11. 24. 20:47
반응형

Java에는 Integer, Float, Double, Long의 가변형이 있습니까?

Integer와 같은 가변 버전을 사용하고 싶은 상황입니다.아래 클래스를 사용해야 합니까? 아니면 Java에 기본 제공이 있습니까?

http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm

항상 다음과 같은 배열로 값을 줄바꿈할 수 있습니다.int[] mutable = {1};변환 가능한 래퍼 클래스에 코드를 포함시키는 것이 너무 번거로운 경우.

이제 JDK 1.5 Java는java.util.concurrent.atomic.AtomicInteger

다음은 스레드 세이프 가변 정수입니다.사용 예시는 다음과 같습니다.

final AtomicInteger value = new AtomicInteger(0);

그 후,

value.incrementAndGet();

아니요, Java에는 이러한 기능이 내장되어 있지 않습니다.그리고 그것은 이유가 있다.변이형을 사용하는 것은 오용되기 쉽기 때문에 위험하다.게다가 실장도 매우 간단합니다.예를 들어 commons-lang에는 가 있습니다.

다음은 가변 정수를 위해 만든 작은 클래스입니다.

public class MutableInteger {
    private int value;
    public MutableInteger(int value) {
        this.value = value;
    }
    public void set(int value) {
        this.value = value;
    }
    public int intValue() {
        return value;
    }
}

이것을 다른 원시적인 것으로 쉽게 확장할 수 있습니다.물론 모두가 말하는 것처럼 신중하게 사용해야 합니다.

@Alexandre가 제안하는 것처럼 nnn[]를 모든 프리미티브타입의 가변 오브젝트로 사용할 수 있습니다.java에는 AtomicInteger와 AtomicLong도 있습니다.

IMHO int는 보통 Integer보다 더 나은 선택이며, 이는 가변입니다.

여러 개체가 필요한 이유에 대해 더 자세히 설명해 주시겠습니까? 같은 작업을 수행하는 다른 방법이 있을 수 있습니다.

AtomicInteger는 이미 언급되어 있습니다.변이 가능Double는 에뮬레이트 할 수 있습니다.AtomicReference<Double>이미 언급한 경고가 적용되어 잘못된 스타일입니다만, 이러한 코드가 있는 경우가 있습니다.

double sum=0
for (Data data:someListGenerator())
  sum+=data.getValue()

기능적인 Java 8 스타일로 리팩터링하고 싶다.코드가 이 패턴을 따르지만 상당히 복잡해진다면 가장 합리적인 변환은 다음과 같습니다.

AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
  sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();

물론 이것은 적어도 의심스러운 스타일이다.하지만 난 내가 한 번 이상 비틀린 상황에 처했다는 걸 알았어ResultSet컴퓨팅과 부분적인 축적을 통해 세 가지 다른 정보를 얻을 수 있습니다.따라서 코드를 적절한 기능 스타일로 변환하는 것이 매우 어렵습니다.상기 패턴에 따라 누적 부품을 변환하는 것은 클린 코드와 지나치게 단순화된 리팩터링 사이의 합리적인 트레이드오프인 것처럼 보였다.

org.omg를 가져올 수 있습니다.CORBA 패키지(또는 필요한 클래스만)에서 홀더 클래스를 사용할 수 있습니다.

예를 들어, 정수를 저장하는 필드가 공용인 "IntHolder"를 사용하여 정수를 수정할 수 있습니다.

public static void triple(IntHolder x){
    x.value = 3 * x.value;
}

IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);     
System.out.println(mutableInt.value);

'롱홀더'와 '더블'도 있다.홀더' 및 기타 사용할 수 있는 수 많은 기타.주의하여 사용하십시오.

여기 api가 있습니다.https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html

언급URL : https://stackoverflow.com/questions/4520137/does-java-have-mutable-types-for-integer-float-double-long

반응형