Kiedy patrzysz na javadoc klasy java.util.Date, większość metod jest przestarzała. Dlaczego to się stało?Dlaczego większość metod java.util.Date jest przestarzała?
Odpowiedz
Cóż, z dwóch powiązanych powodów. Była to bardzo słaba implementacja pojęcia Daty i Czasy i została zastąpiona przez klasę Calendar
.
Klasy Calendar
, choć poprawa, pozostawia wiele do życzenia, więc dla poważnej pracy Data/czas, wszyscy polecają Joda-Time. Java 8 przynosi nowy java.time.* package, zainspirowany przez Joda-Time, zdefiniowany przez JSR-310 i ma zastąpić stare klasy Data/Kalendarz.
Edytuj: W odpowiedzi na konkretne pytanie, dlaczego wdrożenie jest złe, jest wiele przyczyn. JavaDoc podsumowuje następująco:
Niestety interfejs API tych funkcji nie podlegał internacjonalizacji.
Oprócz tego ogólnego niedoboru (która obejmuje kwestie jak brak komponentu strefy czasowej, jak również formatowanie daty, która jest lepiej obsługiwane w DateFormat
i niemożność uzyskania niż gregoriański reprezentacji kalendarzowym), nie są konkretne problemy, które naprawdę szkodzą klasie Date
, w tym fakt, że rok jest przedstawiony w offsecie 1900 z roku Common Era.
Calendar
ma swoje własne problemy, ale nawet już w JDK 1.1 było oczywiste, że java.util.Date
nie zamierza go uciąć. Mimo że Calendar
jest argumentem, że jest najgorszym interfejsem API JDK, to do wersji 7 próbuje go adresować.
Są one przestarzałe, ponieważ Data została napisana tak szybko, jak to możliwe, w dniu, w którym chciały one sprowadzić JDK do drzwi.
Okazuje się, że daty i kalendarze są trudne. Stworzyli więc klasę Kalendarza, o wiele bardziej przemyślaną, aby poradzić sobie z trudnymi aspektami pracy z kalendarzami.
Wycofano metody dat i przekazano je do Kalendarza, ponieważ nie chciały one zmienić zachowania istniejących metod Date i prawdopodobnie przerwać istniejące aplikacje.
Date
jest zmiennyDate
nie posiada wsparcie dla stref czasowych
Ten ostatni doprowadził do niej zastąpione Calendar
. I były w połączeniu z łatwości użycia, prowadzić zarówno zastąpione Joda-Time/JSR-310 (java.time.* package)
JSR-310, a nie JSR-313. – Jesper
Dziękuję IBM za Kalendarz, DateFormatter i wszystkie inne powiązane bzdury. Kolejny świetny przykład nadmiernego uziemienia bez faktycznego rozwiązania problemu. –
nie wiem oficjalny powód, dlaczego została wycofana, ale o ile mogę powiedzieć GregorianCalendar
i Joda-Time obsługuje operacje na datach, co oznacza, że można na przykład dodać dzień do daty i odpowiednio zmienić jego miesiąc i rok.
Na przykład, powiedz, że chcesz obliczyć dzień po aktualnej dacie, a dzisiaj jest 31 maja; z java.util.Date
, masz po prostu getDays() +1
, który zwraca 32, i musisz zająć się wiedzą, że bieżący miesiąc nie ma 32 dni przez siebie; z GregorianCalendar
lub Joda.time dodanie dnia do 31 maja powoduje, że obiekt reprezentuje 1 czerwca, ukrywając złożoność przed wzrokiem.
Twój przykład nie jest problemem z obiektem Date, ale z kodem, który go używa. Gregorian Kalendarium zrobi dokładnie to samo. Więc cały ten punkt jest dyskusyjny. – Supericy
Oto dobra odpowiedź prosto z Oracle: http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
Wieloletnia Bugbear programistów Java było niewystarczające wsparcie dla daty i czasu użytkowania przypadków zwykłych programistów.
Na przykład istniejące klasy (takie jak
java.util.Date
iSimpleDateFormatter
) nie są wątkowo bezpieczne, co prowadzi do potencjalnych problemów dotyczących współbieżności dla użytkowników - nie jest to coś, czego przeciętny programista spodziewałby się rozwiązać podczas pisania kodu obsługi daty.Niektóre z klas daty i godziny również wykazują dość słabą konstrukcję interfejsu API. Na przykład lata
java.util.Date
zaczynają się od 1900, miesiące zaczynają od 1, a dni zaczynają się od 0 - niezbyt intuicyjne.... reprezentuje chwilę na osi czasu - opakowanie o liczbie milli sekund od czasu UNIX-a, ale jeśli wywołasz toString(), wynik sugeruje, że ma strefę czasową, powodując zamieszanie programistów.
Wygląda na to, że autor nie zadał sobie trudu, żeby sprawdzić swój artykuł. Zgodnie z dokumentacją online Java [java.util.Date] (http://docs.oracle.com/javase/7/docs/api/java/util/Date.html) dni zaczynają się od '1' i miesięcy zaczynają się od '0'. Oba odpowiadają interfejsowi API systemu UNIX, patrz [time.h] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/time.h.html). –
- 1. Dlaczego funkcja fgets jest przestarzała?
- 2. Dlaczego interfejs API daty Java (java.util.Date, .Calendar) jest taki bałagan?
- 3. Dlaczego obsługa Velocity jest przestarzała wiosną 4.3?
- 4. Dlaczego moja assertEquals() jest przestarzała w JUnit?
- 5. Android Databinding Compile Ostrzeżenie: odwołanie metod za pomocą "." jest przestarzała
- 6. CodeDomProvider.CreateCompiler() jest przestarzała
- 7. Alternatywna metoda setHours() java.util.Date?
- 8. Dlaczego usługa NSCell jest przestarzała i dlaczego została wprowadzona?
- 9. App Zaprasza jest przestarzała
- 10. ConfigurationSettings.AppSettings jest przestarzała
- 11. requiredContentSizeIdentifiers jest przestarzała
- 12. presentModalViewController: animowane jest przestarzała
- 13. NSURLConnection initWithRequest jest przestarzała
- 14. UITextAttributeTextShadowOffset jest przestarzała
- 15. Klasa XmlValidatingReader jest przestarzała
- 16. MySqlCommand Command.Parameters.Add jest przestarzała
- 17. UILineBreakModeWordWrap jest przestarzała
- 18. System.Net.IPAddress.Address' jest przestarzała
- 19. SMSManager jest przestarzała
- 20. org.hibernate.dialect.PostgreSQLDialect jest przestarzała
- 21. Typ WebMvcConfigurerAdapter jest przestarzała
- 22. Galeria typów jest przestarzała
- 23. Serializing java.util.Date
- 24. Jaka jest domyślna strefa czasowa w java.util.Date
- 25. Dlaczego funkcja saveOrUpdateAll jest przestarzała na wiosnę HibernateOperations
- 26. Dlaczego lista i lista przyjaciół nie jest przestarzała?
- 27. RKResponseDescriptor w RESTKit jest przestarzała
- 28. Pomijanie „«...»jest przestarzała” podczas korzystania respondsToSelector
- 29. Dlaczego funkcja auto_link była przestarzała w Railsach?
- 30. Czy usługa .NET Remoting jest naprawdę przestarzała?
Czyste przejście z niewystarczającego do niezrozumiałego w jdk 1.1 :) – msandiford
Również klasa "Data" została nazwana słabo. Powinni go nazwać Czasem lub Datą Czasową. –