Integer와 같은 변경 가능한 버전을 사용하고 싶은 상황에 있습니다. 이 클래스 (아래)를 사용해야합니까? 아니면 Java에 내장 된 것이 있습니까?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
Integer와 같은 변경 가능한 버전을 사용하고 싶은 상황에 있습니다. 이 클래스 (아래)를 사용해야합니까? 아니면 Java에 내장 된 것이 있습니까?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
n
칼로리가있는 음식 조각 저장, 고갈 / 추가 될 수 있음)의 경우 사용 이름을 따서 명명 된 클래스를 사용하는 것이 더 나을 수 있습니다 (예 : class FoodItem { int calories; }
더 명확하고 메서드가 나중에 필요에 따라 추가 할 수.
int
한 메서드에서 증가하는 것처럼 작동하지 않고 값이 다른 메서드에 반영되지 않습니다.
답변:
아니요, Java에는 이러한 기능이 내장되어 있지 않습니다. 그 이유가 있습니다. 변경 가능한 유형을 사용하는 것은 쉽게 오용 될 수 있으므로 위험합니다. 또한 구현하기가 정말 쉽습니다. 예를 들어 commons-lang에는 MutableInt
.
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;
}
}
이것을 다른 프리미티브로 쉽게 확장 할 수 있습니다. 물론 다른 사람들이 말하는 것처럼 신중하게 사용해야합니다.
MutableInteger
, MutableDouble
, MutableString
등등을 대신 가지고 Mutable<Integer>
, Mutable<Double>
... (사용하는 메모리 오버 헤드 Integer
이상은 int
일반적으로 계정에 해당하지 않습니다. 그러나 당신은 얻을 하나, (당신이 당신의 정수는 여전히 서브 클래스에 필요 비교 또는 이와 유사한 것, 생각을하길 원한다면) 대부분의 경우를 처리 할 수있는 클래스를 사용할 준비가.
@Alexandre가 제안한 것처럼 nnnn []을 모든 기본 유형에 대한 변경 가능한 객체로 사용할 수 있습니다. java에는 AtomicInteger 및 AtomicLong도 있습니다.
IMHO int는 일반적으로 Integer보다 나은 선택이며 변경 가능합니다.
여러 개체가 필요한 이유에 대해 자세히 설명해 주시겠습니까? 동일한 작업을 수행하는 다른 방법이있을 수 있습니다.
int
항상 변경 가능한 그 또한하지 않는 한final
Integer a = 4;
다음 a = 5;
유효한 코드이지만, Integer
변경할 수 없습니다.
Integer
인스턴스에 대한 참조가 있어도 변경 불가능 하다는 데 동의 하지만 다른 유형입니다.
int
메서드에 전달하면 메서드가 값을 변경하고 새 값을 호출 메서드에 반영 할 방법이 없기 때문에 변경할 수 없습니다
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
컴퓨팅에 대한 뒤틀린 루프 와 부분적으로 세 가지 다른 정보를 누적 하는 상황에 두 번 이상 나 자신을 발견 했습니다. 이로 인해 코드를 적절한 기능 스타일로 변환하기가 정말 어렵습니다. 위의 패턴에 따라 누적 부분을 변환하는 것은 깨끗한 코드와 지나치게 단순화 된 리팩토링 사이의 합리적인 균형으로 보였습니다.
someStreamGenerator().mapToDouble(Data::getValue).sum()
. 비록 세 가지 정보를 축적되는 들어,이 기능을 사용하여 방법 Stream.reduce
나 Stream.collect
. 모든 루프를 기능 코드 조각으로 리팩토링 할 이유는 없지만 그렇게하려면 끝까지 가야합니다.
for
그리고 foreach
어떻게 든 주위를 나머지 코드를 정렬 할 수 있도록, 기능적으로 다시 작성하는 복잡한 프레임 워크의 일부가 될 수 있습니다.
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