2011-04-21 5 views
8

Java에서 참조로 double 값을 전달하는 방법은 무엇입니까?java - 참조로 double 값 전달

예 :

Double a = 3.0; 
Double b = a; 
System.out.println("a: "+a+" b: "+b); 
a = 5.0; 
System.out.println("a: "+a+" b: "+b); 

이 코드 인쇄 :

a: 3 b: 3 
a: 5 b: 5 

내 목표 : 은 내가 쓰고 있어요

a: 3 b: 3 
a: 5 b: 3 

내 문제는 인쇄에 얻을 수 있습니다 제스의 전문가 시스템, 그 애플리케이션에서 세그먼트는 길이가 두 배가 될 것이고, 이제는 더블 v alue는 단일 세그먼트에 없습니다. 그것은 다른 많은 부분들, 비례 성 클래스들 ...에 있습니다. 그것들 모두는 그것들을 참조하고 있고, 그것이 어떤 규칙들을 만날 수 있도록 변화하기를 기다리고 있습니다.

변경할 수 없으면 해당 double 값을 참조하는 개체가 포함 된 특정 규칙이 실행되지 않습니다.

+1

아무것도있다. 모든 것은 가치에 의해 전달됩니다. –

+0

@Chris 또는 더 정확하게 http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing – Datoraki

답변

1

@ 제목 자체 : "더러운"트릭을 사용할 수 없습니다. 가장 쉬운 방법은 배열 또는 필드가 포함 된 클래스를 전달하는 것입니다. 변경 사항은 잘 반영됩니다.

그러나 문제는 완전히 다른 것입니다. 복식은 변경 불가능하므로 모든 변경 사항이 새로운 값을 반환합니다. 자신의 클래스를 구현하는 것 외에는 할 수있는 일이 없습니다.

+0

이미 통과 클래스로 간주했지만, 할 수없는 것처럼 보였습니다. – Ouais

4

래퍼 유형은 Java에서 변경할 수 없습니다. 일단 생성되면, 그 값은 변경 될 수 없습니다 (물론 반사 마법을 통하지 않고). 왜 당신이하고있는 일을하려는거야?

편집 : 더블 변경할 수 있다면, 당신은

같은 것을 할 수 있었다

a = new Double(5.0); 

:

a = 5.0; 

무엇 실제로 일이 끝나는 것은 무엇인가 같다 : 설정 한 경우 그냥, 정교하기

a.setValue(5.0);// this would have worked for mutable objects, but not in this case 

물론 자신의 클래스를 작성할 수 있지만 여기에 함정이 많이 있기 때문에 목표를 설명하는 것이 가장 좋습니다.

+0

기하학적 문제를 해결하기 위해 전문가 시스템을 작성하고 있습니다. jess에서, 그리고 어떤 이중 값은 세그먼트의 길이가 많은 클래스의 일부라는 것을 말합니다. 이제는 double 값 대신 세그먼트를 저장할 클래스를 만들 수 있지만, 이것은 미니 클래스 폭발을 일으킬 것입니다. – Ouais

+1

아니요, 맞습니다. 클래스가 Doubles가 아닌 "Segments"를 보유하는 경우. 이렇게하면 의도가 명확 해지며 두 배가 아닌 다른 것을 사용하도록 게임을 수정 한 경우에는 영향이 적습니다. 너무 많은 클래스들에 대해 걱정하지 마세요, OOP에서는, 너무 많은 클래스들 같은 것이 없습니다. –

+0

나는 그것이 그럴듯한 방법이라고 생각합니다. 고마워요. – Ouais

0

수 없습니다. 자바에서는 매개 변수가 메서드에 전달되는 방법 (값/기준)을 선택할 수 없습니다.

3

MutableDouble을 commons-lang에서 시도 할 수 있습니다.

그러나 이것은 참조로 전달과는 아무 관계가 없습니다. 아무 것도 전달하지 않습니다.

+0

사실, double의 복사 생성자가 객체를 값으로 전달하고 있고, 참조로 전달하려고합니다. 질문이 애매한 것 같으면 – Ouais

+0

@Ouais - 자바에서는 참조 자체를 전달할 수 없습니다. 참고. 'a = 5.0'을 할 때, 5.0으로 설정되는 것은'a'와 같지 않습니다 - 그것이 사실이라면'b'도 5를 가질 것입니다. – CoolBeans

1

Java에서는 double을 사용할 수 없습니다. 할당 a = 5.0은 a의 Double 값을 변경하지 않습니다. 실제로 완전히 새로운 Double 객체를 만들고 그 객체를 가리 키도록 포인터의 값을 변경합니다. 참조를 변경하지 않고 값을 변경할 수있게하려면 변경 가능한 Double을 만들어야합니다.

public class MutableDouble { 
    private Double value; 

    public Double getValue() { 
    return value; 
    } 

    public void setValue(Double value) { 
    this.value = value; 
    } 

    @Override 
    public String toString() { 
    return value != null ? value.toString() : "null"; 
    } 
} 

그런 다음 a.setValue (5.0); 둘 다 바뀔 것이다.

5

Java는 포인터를 지원하지 않으므로 C/C++ 에서처럼 직접 메모리를 가리킬 수 없습니다.

자바는 참조를 지원하지만 참조는 객체에 대한 참조 일뿐입니다. 기본 (내장) 유형은 참조 할 수 없습니다. 그래서 실행했을 때 (autoboxing이 코드를 다음과 같이 변환했습니다).

Double a = new Double (3.0); 당신이

Double b = a; 

을 실행할 때 당신이의 객체에 대한 참조를 얻을 수 있다는 것을 의미

. 당신은 (결국 이것에 위의 코드를 변환합니다 오토 박싱) 이전에 new Double(3.0) 생성에 B의 참조에 영향을 미치지 않습니다

a = new Double(5.0); 

을을 변경하려면 선택합니다. 다른 말로하면 직접 조작하여 (또는 자바에서 "먼 거리에서의 행동"이 없음) b의 참조에 영향을 줄 수는 없습니다. 말했다

는 다른 솔루션 참조에 의해 전달되는 자바

public class MutableDouble() { 

    private double value; 

    public MutableDouble(double value) { 
    this.value = value; 
    } 

    public double getValue() { 
    return this.value; 
    } 

    public void setValue(double value) { 
    this.value = value; 
    } 
} 

MutableDouble a = new MutableDouble(3.0); 
MutableDouble b = a; 

a.setValue(5.0); 
b.getValue(); // equals 5.0