[java] Java에는 Integer, Float, Double, Long에 대한 변경 가능한 유형이 있습니까?
Integer와 같은 변경 가능한 버전을 사용하고 싶은 상황에 있습니다. 이 클래스 (아래)를 사용해야합니까? 아니면 Java에 내장 된 것이 있습니까?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
답변
아니요, Java에는 이러한 기능이 내장되어 있지 않습니다. 그 이유가 있습니다. 변경 가능한 유형을 사용하는 것은 쉽게 오용 될 수 있으므로 위험합니다. 또한 구현하기가 정말 쉽습니다. 예를 들어 commons-lang에는 MutableInt
.
답변
int[] mutable = {1};
가변 래퍼 클래스에 대한 코드를 포함하는 것이 너무 번거 롭다면 항상 값을 배열로 래핑 할 수 있습니다.
답변
JDK 1.5 Java부터 이제 java.util.concurrent.atomic.AtomicInteger
스레드로부터 안전한 가변 정수입니다. 사용 예 :
final AtomicInteger value = new AtomicInteger(0);
그리고 나중에 :
value.incrementAndGet();
답변
다음은 변경 가능한 정수로 만든 작은 클래스입니다.
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가 제안한 것처럼 nnnn []을 모든 기본 유형에 대한 변경 가능한 객체로 사용할 수 있습니다. java에는 AtomicInteger 및 AtomicLong도 있습니다.
IMHO int는 일반적으로 Integer보다 나은 선택이며 변경 가능합니다.
여러 개체가 필요한 이유에 대해 자세히 설명해 주시겠습니까? 동일한 작업을 수행하는 다른 방법이있을 수 있습니다.
답변
AtomicInteger
이미 언급되었습니다. mutable 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 패키지 (또는 필요한 클래스)를 가져올 수 있으며 그 안에 Holder 클래스를 사용할 수 있습니다.
예를 들어, 정수를 저장하는 필드가 public 인 “IntHolder”가있어이를 수정할 수있는 액세스 권한을 부여합니다.
public static void triple(IntHolder x){
x.value = 3 * x.value;
}
IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);
System.out.println(mutableInt.value);
또한 “LongHolder”및 “DoubleHolder”및 사용할 수있는 기타 항목도 많이 있습니다. 주의해서 사용하십시오.
여기에 대한 API가 있습니다 : https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html