[java] Java에 상수 기능이없는 이유는 무엇입니까?

Java에서 상수 뒤에있는 이유를 찾으려고 노력하고 있었는데 Java를 사용하여 final키워드 를 사용하여 상수를 선언 할 수 있다는 것을 알게되었습니다 .

내 질문은 Java가 상수 ( const) 기능을 도입하지 않은 이유 입니다. 많은 사람들이 C ++에서 왔다고 말하고 있으므로 C ++에는 const키워드가 있습니다.

당신의 생각을 공유하십시오.



답변

무거운 C ++ 코딩에서 Java로 갈 때마다 Java의 const-correctness 부족에 적응하는 데 약간의 시간이 걸립니다 . constC ++에서의 사용법은 모르는 경우 상수 변수를 선언하는 것과 크게 다릅니다. 본질적으로 const-pointer라는 특수한 포인터를 통해 액세스 할 때 객체를 변경할 수 없도록합니다 .Java에서는 일반적으로 const-pointer를 반환하려는 위치에서 인터페이스 유형으로 참조를 반환합니다 부작용이 없어야하는 메소드 만 포함합니다. 불행히도, 이것은 언어에 의해 시행되지 않습니다.

Wikipedia는 주제에 대해 다음 정보를 제공합니다.

흥미롭게도 Java 언어 사양은 const를 예약 키워드 (즉, 변수 식별자로 사용할 수없는 키워드)로 간주하지만 의미를 할당하지 않습니다. 키워드의 예약은 Java 언어의 확장이 C ++ 스타일 const 메소드 및 const 유형에 대한 포인터를 포함 할 수 있도록하기 위해 발생한 것으로 생각됩니다. Java에서 프로세스 정확성을 구현하기위한 Java 커뮤니티 프로세스의 개선 요청 티켓은 2005 년에 닫혔으며 이는 const 정확성이 공식 Java 스펙에 절대 영향을 미치지 않을 것임을 암시합니다.


답변

무엇을 const의미
첫째, 실현을하는 “CONST”의 의미 키워드 수단 다른 사람들에게 여러 가지를 :

  • 읽기 전용 참조 -Java final의미론-참조 변수 자체는 다른 인스턴스 (메모리 위치)를 가리 키도록 재 할당 할 수 없지만 인스턴스 자체는 수정할 수 있습니다
  • 읽기 전용 참조 -C const포인터 / 참조 시맨틱-이 참조는 인스턴스를 수정하는 데 사용될 수 없음을 의미합니다 (예 : 인스턴스 변수에 할당 할 수없고 변경 가능한 메소드를 호출 할 수 없음)-참조 변수에만 영향을 미치므로 동일한 인스턴스가 인스턴스를 수정할 수 있습니다
  • 불변 객체 -인스턴스 자체를 수정할 수 없음을 의미-인스턴스에 적용되므로 비 const 참조는 허용되지 않거나 인스턴스를 수정하는 데 사용할 수 없습니다
  • 위의 일부 조합 ?
  • 다른 사람 ?

왜 또는 왜const
두 번째가 아닌지, “pro”대 “con”인수 중 일부를 파고 싶다면이 개선 요청 (RFE) “버그”아래의 설명을 참조하십시오. 이 RFE는 “읽기 전용 참조”유형 “const”기능을 요청합니다. 1999 년에 문을 연 후 2005 년에 Sun에 의해 폐쇄 / 거부 된 “const”주제는 다음과 같이 활발하게 논의되었습니다.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070

양쪽에 좋은 주장이 많이 있지만 다음과 같은 자주 언급되는 이유 중 일부는 const다음 과 같습니다.

  • 남용 및 / 또는 오용 될 수 혼란 의미를 가질 수있다 (투시 무엇 const평균 위)
  • 사용 가능한 기능을 복제 할 수 있음 (예 : 불변 인터페이스를 사용하여 불변 클래스 설계)
  • 특징적인 크리프가 발생하여 값으로 객체를 전달하는 것과 같은 다른 의미 변경이 필요할 수 있습니다.

이것이 좋은 이유인지 나쁜 이유인지에 대해 누군가 토론하기 전에, 이것이 나의 이유아니라는 점에 유의하십시오 . 그것들은 내가 RFE 토론을 감추지 않고 얻은 몇 가지 이유의 “장점”입니다. 나는 그들 자신에 반드시 동의하지는 않습니다.-나는 왜 일부 사람들 (내가 아닌)이 const키워드가 좋은 생각이 아닐 수 있다고 느끼는지 인용하려고합니다 . 개인적으로, 나는 더 많은 “const”의미를 모호하지 않은 방식으로 언어에 도입하기를 원합니다.


답변

const C ++에서 값이 상수라는 의미는 아닙니다.

const C ++에서 계약의 클라이언트는 그 가치를 변경하지 않을 것을 암시합니다.

const스레드 기반 동시성을 지원하는 환경에 있으면 식 의 값이 변경 되는지 여부 가 더 분명해집니다.

Java는 처음부터 스레드 및 잠금 동시성을 지원하도록 설계되었으므로 의미를 갖도록 용어를 오버로드하여 혼란을 가중시키지 않았습니다 final.

예 :

#include <iostream>

int main ()
{
    volatile const int x = 42;

    std::cout << x << std::endl;

    *const_cast<int*>(&x) = 7;

    std::cout << x << std::endl;

    return 0;
}

출력 42와 7.

Const가 아닌 별칭이 만들어지면서로 x표시 되었지만 상수는 아닙니다. 모든 컴파일러 가이 동작에 필요한 것은 아닙니다 (모든 컴파일러가 상수를 인라인하도록 허용되어 있음)constxvolatile

더 복잡한 시스템에서는을 사용하지 않고 const / const가 아닌 별명을 const_cast얻게되므로 const가 변경되지 않는 것을 의미하는 습관을들이는 것은 점점 더 위험 해집니다. const단지 코드가 캐스트없이 코드를 변경할 수 없으며 값이 일정하지 않다는 것을 의미합니다.


답변

이것은 약간의 오래된 질문이지만,이 스레드가 오늘 대화에 나왔기 때문에 어쨌든 2 센트를 기부 할 것이라고 생각했습니다.

왜 const가 없는지 정확히 대답하지 못 합니까? 그러나 클래스를 불변으로 만드는 방법 . (안타깝게도 아직 받아 들여진 답변에 대한 의견으로 게시 할만 큼 평판이 충분하지 않습니다)

객체의 불변성을 보장하는 방법은 불변의 클래스를 더 신중하게 디자인하는 것입니다. 이것은 변경 가능한 클래스보다 약간 더주의가 필요합니다.

이것은 Josh Bloch의 유효 Java 항목 15-최소화 최소화로 되돌아갑니다 . 책을 읽지 않았다면 사본을 들고 몇 번 이상 읽습니다. 나는 당신의 비유적인 “자바 게임”을 보장합니다 .

항목 15에서 Bloch는 객체의 상태를 보장하기 위해 클래스의 가변성을 제한해야한다고 제안합니다.

책을 직접 인용하려면 :

불변 클래스는 단순히 인스턴스를 수정할 수없는 클래스입니다. 각 인스턴스에 포함 된 모든 정보는 생성 될 때 제공되며 개체 수명 동안 고정됩니다. Java 플랫폼 라이브러리에는 String, 박스형 기본 클래스 및 BigInteger 및 BigDecimal을 포함하여 많은 불변 클래스가 포함되어 있습니다. 이에 대한 여러 가지 이유가 있습니다. 변경 불가능한 클래스는 변경 가능 클래스보다 설계, 구현 및 사용하기가 더 쉽습니다. 오류가 적고 더 안전합니다.

그런 다음 Bloch는 5 가지 간단한 규칙에 따라 클래스를 변경 불가능하게 만드는 방법을 설명합니다.

  1. 객체의 상태를 수정하는 메소드를 제공하지 마십시오 (예 : setter, aka mutators ).
  2. 클래스를 확장 할 수 없는지 확인하십시오 (이것은 클래스 자체를로 선언 함을 의미합니다 final).
  3. 모든 필드를 확인하십시오 final.
  4. 모든 필드를 확인하십시오 private.
  5. 변경 가능한 구성 요소에 독점적으로 액세스하십시오. (물체를 방어 적으로 복사하여)

자세한 내용은 책의 사본을 선택하는 것이 좋습니다.


답변

의 C ++ 의미는 constJava와 매우 다릅니다 final. 디자이너가 사용 const했다면 불필요하게 혼란 스러웠을 것입니다.

사실 const예약어는 디자이너가 구현을위한 아이디어를 가지고 제안 const,하지만 그들은 그것에 대하여 결정 이후있다; 이 닫힌 버그를 참조하십시오 . 명시된 이유에는 C ++ 스타일에 대한 지원을 추가 const하면 호환성 문제가 발생할 수 있습니다.


답변

Java에서 “const”변수를 작성하는 방법이 있지만 특정 클래스에 대해서만 가능합니다. 최종 속성을 가진 클래스를 정의하고 서브 클래스로 만드십시오. 그런 다음 “const”를 사용하려는 기본 클래스를 사용하십시오. 마찬가지로 “const”메소드를 사용해야하는 경우 기본 클래스에 추가하십시오. 컴파일러는 기본 클래스의 최종 메소드라고 생각하는 것을 수정할 수 없지만 서브 클래스에서 메소드를 읽고 호출합니다.


답변

상수를 정의하는 두 가지 방법이 있습니다- const그리고 static final정확히 동일한 의미로. 또한 static final행동보다 더 나은 설명const