Java에 상수 기능이 없는 이유는 무엇입니까?
나는 자바에서 상수 뒤에 있는 이유를 알아내려고 했다. 자바는 우리가 다음을 사용하여 상수를 선언할 수 있도록 한다는 것을 배웠다.final
키워드를 지정합니다.
제 질문은 왜 Java가 상수(Constant)를 도입하지 않았냐는 것입니다.const
)의 기능입니다.많은 분들이 C++에서 왔다고 하시니까 C++에 저희가 있습니다.const
키워드를 지정합니다.
소감을 말씀해주세요.
무거운 C++ 부호화에서 Java로 이행할 때마다 Java의 const-correct가 부족한 것에 적응하는 데 시간이 걸립니다.의 이 사용법const
C++는 상수 변수를 선언하는 것과 크게 다릅니다.기본적으로 const-pointer라고 불리는 특수한 종류의 포인터를 통해 객체에 접근했을 때 오브젝트가 불변함을 보증합니다.Java에서는 일반적으로 const-pointer를 반환하고 싶은 장소에서는 대신 부작용이 없어야 할 메서드만 포함하는 인터페이스 타입의 참조를 반환합니다.안타깝게도, 이것은 언어학에서 시행하지 않습니다.
위키피디아는 이 주제에 대해 다음과 같은 정보를 제공합니다.
흥미롭게도 Java 언어 사양에서는 Const를 예약된 키워드(예: 변수 식별자로 사용할 수 없는 키워드)로 간주하지만 의미론은 할당하지 않습니다.키워드 예약은 C++ 스타일의 const 메서드와 const type 포인터를 포함하도록 Java 언어를 확장하기 위해 발생한 것으로 생각됩니다.Java에서 const correction을 구현하기 위한 Java Community process의 확장 요청 티켓은 2005년에 종료되었으며, 이는 const correction이 공식 Java 사양에 반영되지 않음을 의미합니다.
무엇인가.const
의미하다
첫째, "const" 키워드의 의미론은 사람마다 다르다는 것을 깨달으십시오.
- 읽기 전용 참조 - Java
final
semantics - 참조 변수 자체는 다른 인스턴스(메모리 위치)를 가리키도록 재할당할 수 없지만 인스턴스 자체는 수정할 수 있습니다. - 읽기 전용 참조 - C
const
포인터/참조 의미 - 이 참조를 사용하여 인스턴스를 수정할 수 없음을 의미합니다(예: 인스턴스 변수에 할당할 수 없으며, 가변 메서드를 호출할 수 없음). 참조 변수에만 영향을 미치므로 동일한 인스턴스를 가리키는 일정한 참조가 인스턴스를 수정할 수 있습니다. - immutable object - means the instance itself cannot be modified - applies to instance, so any non-const reference would not be allowed or could not be used to modify the instance
- some combination of the the above?
- others?
Why or Why Not const
Second, if you really want to dig into some of the "pro" vs "con" arguments, see the discussion under this request for enhancement (RFE) "bug". This RFE requests a "readable-only reference"-type "const" feature. Opened in 1999 and then closed/rejected by Sun in 2005, the "const" topic was vigorously debated:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
While there are a lot of good arguments on both sides, some of the oft-cited (but not necessarily compelling or clear-cut) reasons against const
include:
- may have confusing semantics that may be misused and/or abused (see the What does
const
mean above) - may duplicate capability otherwise available (e.g. designing an immutable class, using an immutable interface)
- may be feature creep, leading to a need for other semantic changes such as support for passing objects by value
Before anyone tries to debate me about whether these are good or bad reasons, note that these are not my reasons. They are simply the "gist" of some of the reasons I gleaned from skimming the RFE discussion. I don't necessarily agree with them myself - I'm simply trying to cite why some people (not me) may feel a const
keyword may not be a good idea. Personally, I'd love more "const" semantics to be introduced to the language in an unambiguous manner.
const
in C++ does not mean that a value is a constant.
const
in C++ implies that the client of a contract undertakes not to alter its value.
Whether the value of a const
expression changes becomes more evident if you are in an environment which supports thread based concurrency.
As Java was designed from the start to support thread and lock concurrency, it didn't add to confusion by overloading the term to have the semantics that final
has.
eg:
#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;
}
outputs 42 then 7.
Although x
marked as const
, as a non-const alias is created, x
상수가 아닙니다.모든 컴파일러가 필요한 것은 아닙니다.volatile
(모든 컴파일러가 상수를 인라인화할 수 있지만)
보다 복잡한 시스템에서는 다음 항목을 사용하지 않고 계속/비정수 별칭을 얻을 수 있습니다.const_cast
그래서 항상 뭔가 변하지 않을 거라고 생각하는 습관을 들이는 것은 점점 더 위험해 진다. const
단순히 코드가 캐스트 없이 변경할 수 없다는 것이지 값이 일정하다는 의미는 아닙니다.
좀 오래된 질문이지만, 오늘 이 이야기가 나왔기 때문에 어떻게든 2센트를 기부해야겠다고 생각했습니다.
왜 경찰이 없는지에 대한 정확한 답은 아니지?어떻게 하면 당신의 수업을 불변하게 할 수 있을까요? (불행하게도 저는 아직 받아들여진 답변에 대한 코멘트로 올릴 충분한 평판이 없습니다.)
객체의 불변성을 보증하는 방법은 클래스를 불변하도록 더욱 신중하게 설계하는 것입니다.이것은 가변 클래스보다 조금 더 주의를 요합니다.
이것은 Josh Bloch의 Effective Java Item 15 - Minimize Mutability로 거슬러 올라간다.만약 이 책을 읽지 않으셨다면, 한 권을 집어서 몇 번 더 읽어보세요. 제가 장담하건대, 비유적인 "자바 게임"을 할 것입니다.
항목 15에서 Bloch는 객체의 상태를 보장하기 위해 클래스의 가변성을 제한해야 한다고 제안합니다.
책을 직접 인용하려면:
불변 클래스는 단순히 인스턴스를 수정할 수 없는 클래스입니다.각 인스턴스에 포함된 모든 정보는 생성 시 제공되며 개체의 수명 동안 고정됩니다.Java 플랫폼 라이브러리에는 String, 박스형 프리미티브 클래스, BigInteger 및 BigDecimal 등 불변의 클래스가 다수 포함되어 있습니다.여기에는 여러 가지 타당한 이유가 있습니다.불변 클래스는 가변 클래스보다 설계, 구현 및 사용이 쉽습니다.에러 발생이 적고, 시큐러티도 향상됩니다.
그런 다음 Bloch는 5가지 간단한 규칙을 따라 클래스를 불변하게 만드는 방법을 설명합니다.
- 개체 상태를 수정하는 메서드(예: setters, mutator)를 제공하지 마십시오.
- 클래스를 확장할 수 없는지 확인합니다(이는 클래스 자체를
final
). - 모든 필드 만들기
final
. - 모든 필드 만들기
private
. - 모든 가변 컴포넌트에 대한 배타적 접근을 보장합니다.(오브젝트의 방어용 복사를 함으로써)
자세한 내용은 책 한 권을 집으시는 것을 강력히 추천합니다.
의 C++ 의미론const
자바와는 많이 다르다final
만약 디자이너가 사용했다면const
불필요하게 혼란스러웠을 거예요
이 사실은const
디자이너가 이 시스템을 구현하기 위한 아이디어를 가지고 있었음을 암시하는 예비 단어입니다.const
그 후, 이 폐쇄 버그를 참조해 주세요.C++ 스타일에 대한 지원을 추가하는 것을 포함합니다.const
호환성 문제가 발생합니다.
Java에서는 특정 클래스에 대해서만 "const" 변수를 만드는 방법이 있습니다.최종 속성이 있는 클래스를 정의하고 하위 클래스를 지정하기만 하면 됩니다.그런 다음 "const"를 사용할 기본 클래스를 사용합니다.마찬가지로 "const" 메서드를 사용해야 하는 경우 기본 클래스에 추가합니다.컴파일러는 기본 클래스의 최종 메서드라고 생각되는 것을 수정할 수는 없지만 하위 클래스의 메서드를 읽고 호출합니다.
Static Final을 사용하여 Const와 유사한 작업을 만들 수 있습니다.이거는 예전에 사용한 적이 있습니다.
protected static final int cOTHER = 0;
protected static final int cRPM = 1;
protected static final int cSPEED = 2;
protected static final int cTPS = 3;
protected int DataItemEnum = 0;
public static final int INVALID_PIN = -1;
public static final int LED_PIN = 0;
상수를 정의하는 방법에는 두 가지가 있습니다.const
그리고.static final
는, 완전히 같은 의미입니다.더 나아가static final
동작을 보다 잘 설명합니다.const
언급URL : https://stackoverflow.com/questions/2735736/why-is-there-no-constant-feature-in-java
'programing' 카테고리의 다른 글
Java 8 LocalDate Jackson 형식 (0) | 2022.09.01 |
---|---|
vuex에서 데이터 분리 (0) | 2022.09.01 |
컴파일러가 세미콜론을 찾을 수 없는 이유는 무엇입니까? (0) | 2022.09.01 |
Buefy 입력 필드에 오류가 있는지 프로그래밍 방식으로 확인하는 방법 (0) | 2022.09.01 |
외부 함수와 C++의 비교 (0) | 2022.09.01 |