ProgramingTip

Java 날짜 API (java.util.Date, .Calendar)가 왜 그렇게 엉망입니까?

bestdevel 2020. 12. 5. 10:19
반응형

Java 날짜 API (java.util.Date, .Calendar)가 왜 그렇게 엉망입니까?


대부분의 사람들이 지금까지 고통스럽게 알고 있듯이 달력 날짜 (특히 java.util.Date클래스 java.util.Calendar) 를 처리하는 자바 API 는 끔찍한 혼란입니다.

내 머리 위로 :

  • 날짜 변경 가능
  • 날짜는 날짜가 아닌 타임 스탬프를 나타냅니다.
  • 날짜 구성 요소 (일, 월, 연도 ...)와 날짜간에 쉽게 변환 할 수 없습니다.
  • 매력적인 것은 사용하기 어색하며 다른 시스템을 하나의 클래스로 결합합니다.

이 게시물은 그것을 아주 잘 요약하고 JSR-310 도 보수 문제를 설명합니다.

이제 내 질문은 다음과 가변합니다.

이 클래스는 어떻게 Java SDK로 만들었습니까? 확실히 문제의 대부분은 분명해 보이며 (날짜가 변경 가능함) 쉽게 피할 수 있습니다. 그래서 어떻게 된거 야? 시간 압박? 아니면 돌이켜 보면 문제가 알 수 있습니까?

엄격하게 프로그래밍 질문이 아니라는 것을 알고 있습니다 API 디자인이 어떻게 그렇게 잘못 될 수 있는지 이해하면 흥미로울 것입니다. 결국, 실수는 항상 좋은 학습 기회입니다 (저는 궁금합니다).


누군가 내가 말할 수있는 것보다 더 잘 표현했습니다.

  • 클래스 Date는 밀리 초라고 특정 순간을 나타냅니다. 이 수업의 디자인은 아주 나쁜 농담입니다. 훌륭한 프로그래머조차 얼마나 실수를하는지 냉정한 예입니다. 날짜의 대부분의 방법은 이제 더 이상 사용하지 않았던 클래스의 방법으로 대체되었습니다.
  • 클래스 CalendarDate개체와 연도, 월, 일 및 시간과 같은 정수 필드 집합 변환을위한 추상 클래스입니다 .

  • 클래스 GregorianCalendarCalendarJDK에서 의 유일한 하위 클래스입니다 . 일반적으로 사용되는 달력 시스템에 대한 날짜-필드 변환을 수행합니다. 썬은이 과도하게 엔지니어링 된 쓰레기를 탈 리전트로부터 비용을 절감하는 것입니다.

에서 자바 프로그래머 자주 묻는 질문

린든 데르 피터 반으로, 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에 어떻게 들어 갔는지 거의 설명하고 날짜 클래스의 기원에 대해 설명합니다.

고도로 역기능적인 디자인의 7 가지 습관

참고 URL : https://stackoverflow.com/questions/1571265/why-is-the-java-date-api-java-util-date-calendar-such-a-mess

반응형