IT TIP

"new Date (int year, int month, int day)"가 더 이상 사용되지 않는 이유는 무엇입니까?

itqueen 2020. 12. 12. 12:52
반응형

"new Date (int year, int month, int day)"가 더 이상 사용되지 않는 이유는 무엇입니까?


최근에 상속 한 내 응용 프로그램은 생성자에 대한 사용 중단 경고가 가득합니다.

Date d = new Date(int year, int month, int day)

이처럼 단순한 것을 다음과 같이 "대체"한 이유를 아는 사람이 있습니까?

Date d = null;
Calendar cal = GregorianCalendar.getInstance();
cal.set(1900 + year, month, day);
d = cal.getTime();

자, 분명히 폐기 경고는 그 자체로는 문제가되지 않지만,이 생성자가 제거되면 고통스럽게 울부 짖을 수백만 개의 LOC를 상상할 수 있습니까?

벤치마킹에 대한 짧은 플레이에서 후자는 실행하는 데 약 50 % 더 많은 시간이 걸립니다.


원래 Date는 날짜와 관련된 모든 논리를 포함하도록 의도되었지만 API 설계자는 결국 지금까지 보유한 API가 매우 부적절하고 시간대, 로케일, 다른 달력, 일광 절약 시간과 같은 문제를 올바르게 처리하도록 완전히 확장 할 수 없음을 깨달았습니다. 등

그래서 그들은 Calendar그 모든 복잡성을 다루기 위해 만들어졌고 Date간단한 타임 스탬프 로 강등 되어 형식화, 구문 분석 및 개별 날짜 필드를 다루는 모든 기능을 사용하지 않습니다.

BTW, 내부적으로 Date(int, int, int)생성자 와 같은 이러한 메서드는 이제를 호출 Calendar하므로 속도 차이가 보이면을 호출 할 때 잘못된 작업을하고있는 것 Calendar입니다.

Calendar결론 : 지나치게 복잡한 것은 자바의 API가 아니고 , 인간의 날짜 개념이며, 유일한 문제 Calendar는 가장 일반적인 사용법에 대한 지름길을 많이 제공하지 않는다는 것입니다.


Java Date API는 오랫동안 비판을 받아 왔습니다 . 예를 들어 this thread를 참조하십시오 .

Joda-Time 또는 Apache Commons Lang 에서 대체 날짜 / 시간 유틸리티 를 확인할 수 있습니다 .


대답은 이식성입니다.

수업 Date은 그다지 유연하지 않습니다. 날짜를 정의 할 수 있지만 다른 달력 형식으로 변환 할 수는 없습니다. 그래서 Sun은 Calendar더 유연하게 만들기 위해 추가 클래스 계층 구조 ( ) 를 사용하기로 결정했습니다 .

그럼에도 불구하고별로 편리하지 않습니다.


대부분 원래 java.util.Date가 부풀려서 완전히 시간대를 인식하지 못하고 국제화 친화적이지 않았기 때문입니다.

그러나 Date는 여전히 사용 중이며 Value Objects 또는 데이터 유형으로 매우 잘 사용됩니다. 명시 적으로 불변으로 만드는 한 쉽게 갈 수 있습니다. 나는 그것이 불변해야한다고 생각하는 경향이있다. 다른 목적으로 우리는 우리가 조작 할 달력을 가지고있다. 많은 조작이 예상되는 곳에서는 Joda-Time과 같은 것을 고려해야합니다.

[편집 됨]

후자의 코드에서 Date를 인스턴스화하지 마십시오. 소용이 없습니다. 벤치 마크에 대해 더 나은 결과를 얻을 수 있습니다.


물론 아무도 다른 달력 형식을 사용하지 않지만 새로운 API는 99 % 일반적인 경우에 대해 작성하는 코드의 양을 증가 시키므로 LoC에서 지불하는 Java 프로그래머에게 큰 혜택입니다.


Michael Borgwardt는 기술적으로 가장 좋은 대답을했습니다. 그러나 왜 그는 우리 태양계가 배치 된 방식에 대해 인간을 비난하는 것일까 요?

좋아요, 우리는 초, 분, 시간이라는 아이디어를 생각해 냈습니다.

그러나 지구의 날이 대략적인 것은 우리의 잘못이 아닙니다 (우리가 실제 태양 일, 평균 태양 일 또는 항성일에 대해 이야기하고 있는지 여부에 따라 다르며, 각각 주기적으로 무작위로 변함). 지구 궤도가 태양 주위를 도는 시간이 365 일인 것은 우리 잘못이 아니며, 지구 주위를 도는 달의 궤도가 27.3 일 이라는 것은 우리 잘못이 아닙니다 . 열대, 비정상적 또는 드라 코닉 달).

캘린더가 이러한 모든 세부 정보를 고려하지 않은 것이 기쁘지 않습니까? 그렇다면 소프트웨어 버그는 실제로 달의 위상에 따라 달라질 수 있습니다.

참고 URL : https://stackoverflow.com/questions/460423/why-was-new-dateint-year-int-month-int-day-deprecated

반응형