2017-05-01 8 views
1

내 코드는 다음과 같은 것입니다 :내 클래스의 필드는 다른 두 필드의 합계가 될 수 있습니까? (자바)

Public Class Location 
{ 
    private int piecesA; 
    private int piecesB; 
    private int pieces = piecesA + piecesB; 

    //methods etc. 
} 

별도로 정의 "조각"필드를 가지는 것은 유용하고 훨씬 더 간결하게 어디에 내 코드에서 많은 장소가있다. 그러나 "piecesA"와 "piecesB"의 값을 변경하여 사용하려고하면 "pieces"의 값은 변경되지 않습니다. 누구나 이것이 왜 그런지 설명 할 수 있습니까? (하나의 필드가 다른 두 필드의 합계가 허용되지 않음) 또는 동일한 것을 성취하기위한 대체 방법을 제안 할 수 있습니까?

+0

읽기 자바에서 참조에 대한 :

가장 좋은 방법

는 필드 만 합계에게 호출 될 때마다 평가하는 방법을 가지고 있지 않습니다 원하는 것을 달성하기 위해. – SomeDude

답변

2

여기에서의 문제는, 선언적인 방법에 생각 조각은 항상 piecesA 및 piecesB 필드의 합이 될 것이라고 주장하고있다. 그러나 Java는 선언적 프로그래밍 언어가 아니므로 런타임에 각 표현식을 평가해야합니다. 필드 선언에 표현식이 있으므로 합계가 계산되고 pieces 필드가 할당됩니다.

private int piecesA; 
private int piecesB; 

public int getPieces() { 
    return piecesA + piecesB; 
} 
0

선언 된 값은 부품 중 하나가 변경 될 때마다 다시 계산되지 않습니다. 그것은 컴파일 시간 상수입니다.

는 대신, 게터를 사용

public int getPieces() { 
    return piecesA + piecesB; 
} 
+1

변수가 상수가 아닙니다. 최종 수정자가 부족합니다. 표현식은 항상 0과 같지만 상수가 아닌 변수가 포함되어 있기 때문에 기술적으로 상수 표현식으로 간주되지 않습니다. –

+0

@AndyThomas 저는 변수에 대해 말하지 않았습니다. 나는 계산에 대해서 이야기하고 있었다. 'piecesA + piecesB'라는 표현식은 컴파일 타임 상수 (0)입니다. – Bohemian

+1

당신이 어떤 단어를 언급했는지 알지 못했습니다. 선조는 "선언"이었다. 즉, 표현식은 항상 0으로 평가되지만 JLS에 따라 상수 표현으로 간주되지 않습니다. 그것이 컴파일 타임에 평가되지 않을 수도 있습니다. –