Java 날짜 API (java.util.Date, .Calendar)가 왜 그렇게 엉망입니까?
대부분의 사람들이 지금까지 고통스럽게 알고 있듯이 달력 날짜 (특히 java.util.Date
및 클래스 java.util.Calendar
) 를 처리하는 자바 API 는 끔찍한 혼란입니다.
내 머리 위로 :
- 날짜 변경 가능
- 날짜는 날짜가 아닌 타임 스탬프를 나타냅니다.
- 날짜 구성 요소 (일, 월, 연도 ...)와 날짜간에 쉽게 변환 할 수 없습니다.
- 매력적인 것은 사용하기 어색하며 다른 시스템을 하나의 클래스로 결합합니다.
이 게시물은 그것을 아주 잘 요약하고 JSR-310 도 보수 문제를 설명합니다.
이제 내 질문은 다음과 가변합니다.
이 클래스는 어떻게 Java SDK로 만들었습니까? 확실히 문제의 대부분은 분명해 보이며 (날짜가 변경 가능함) 쉽게 피할 수 있습니다. 그래서 어떻게 된거 야? 시간 압박? 아니면 돌이켜 보면 문제가 알 수 있습니까?
엄격하게 프로그래밍 질문이 아니라는 것을 알고 있습니다 API 디자인이 어떻게 그렇게 잘못 될 수 있는지 이해하면 흥미로울 것입니다. 결국, 실수는 항상 좋은 학습 기회입니다 (저는 궁금합니다).
누군가 내가 말할 수있는 것보다 더 잘 표현했습니다.
- 클래스
Date
는 밀리 초라고 특정 순간을 나타냅니다. 이 수업의 디자인은 아주 나쁜 농담입니다. 훌륭한 프로그래머조차 얼마나 실수를하는지 냉정한 예입니다. 날짜의 대부분의 방법은 이제 더 이상 사용하지 않았던 클래스의 방법으로 대체되었습니다.클래스
Calendar
는Date
개체와 연도, 월, 일 및 시간과 같은 정수 필드 집합 변환을위한 추상 클래스입니다 .클래스
GregorianCalendar
는Calendar
JDK에서 의 유일한 하위 클래스입니다 . 일반적으로 사용되는 달력 시스템에 대한 날짜-필드 변환을 수행합니다. 썬은이 과도하게 엔지니어링 된 쓰레기를 탈 리전트로부터 비용을 절감하는 것입니다.
에서 자바 프로그래머 자주 묻는 질문
린든 데르 피터 반으로, 07.X.1998에서 버전-이 부분은 새롭게 버전에서 제거되었습니다.가변성에 관해서는, 초기 JDK 클래스의 많은 그것은 고통 ( Point
, Rectangle
, Dimension
, ...). 잘못된 최적화, 일부 사람들이 말하는 것을 들었습니다.
불변 항목과 o.getPosition().x += 5
하여 복사본을 생성 ( )하는 대신 협업 ( )을 함께 할 수 있기 때문에 원합니다 o.setPosition(o.getPosition().add(5, 0))
. 이 초기 VM에서는 없을 것이 없을 것입니다.
자바의 초기 API는 시대의 산물에 지나지 언어를 사용합니다. 불변성은 그 후 몇 년 후에 대중적인 개념이 무효화되었습니다. 불변성은 "명백하다"고 사실. 지금은 사실 일 가능성이 있습니다. 이제 "명백하지만"10 년 전이 아니었던 것처럼.
또한 한때 달력을 만드는 데 비용이 많이 들었습니다.
이전 버전과의 서버를 그대로 유지합니다. 더 불행한 것은 실수가 인식되지 않을 경우 이전 클래스가 더 이상 사용하지 않고 앞으로 모든 API에 대해 새 날짜 / 시간 클래스가 생성되는 것입니다. API ( java.time
, JSR 310) 와 같은 JodaTime의 JDK 8 채택으로 어느 정도 발생 했지만 실제로는 너무 늦었습니다.
시간 자체는 측정하고 처리하기가 쉽지 않습니다. 시간 에 대한 위키피디아 기사의 길이를 사용 . 그리고 시간 자체에 대한 다른 이해가 있습니다 : 절대적인 시점 (상수로서), 특정 장소의 시점, 시간 범위, 시간의 해상도 ....
java.util.Date를 처음으로 때를 때 (JDK 1.0?) 정말 기뻤습니다. 내가 아는 언어에는 그런 기능이 없습니다. 나는 시간 변환에 대해 생각하지 않습니다.
한 수준의 이해 (XMLGregorianCaldender vs. Date)와 요구 사항 (Nanoseconds, 2030 년 이후)에서 더 높은 수준으로 발전하지만 이전 수준은 그대로 유지하면 모든 것이 엉망이라고 생각됩니다. 그리고 java.util.Date는 예외가 아닙니다. I / O 하위 시스템 또는 AWT에서 Swing으로의 전환을 수행합니다.
그 때문에 "때때로 리셋 버튼을 눌러야합니다." (누가 그렇게 말했어, btw.?)
다음 게시물이 흥미로울 수 있습니다. 달력 클래스가 처음에 Java API에 어떻게 들어 갔는지 거의 설명하고 날짜 클래스의 기원에 대해 설명합니다.
'ProgramingTip' 카테고리의 다른 글
Angular의 빌드 및 실행 방법 (0) | 2020.12.05 |
---|---|
JavaScript에서 요청 헤더 설정 (0) | 2020.12.05 |
Zend Framework에서 레이아웃 파일을 전환하는 방법은 무엇입니까? (0) | 2020.12.05 |
Facebook은 브라우저 주소 표시 줄에서 페이지의 소스 URL을 어떻게 다시 작성합니까? (0) | 2020.12.05 |
NSManagedObjectContext를 생성 한 단일 또는 큐가 소유하고 Apple이 말하는 것은 무엇을 의미합니까? (0) | 2020.12.05 |