日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jdk8 calendar_JDK 8的Calendar.Builder

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdk8 calendar_JDK 8的Calendar.Builder 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jdk8 calendar

勇敢的Java新世界的定義特征之一是Java空間中構建器模式的日益普及。 Groovy是JVM上最流行的替代語言(對于Java),以在核心庫以及Groovy支持的庫和框架中大量使用Builder而聞名。 Josh Bloch將該模式帶到了Java開發人員社區的最前沿,并在其極具影響力的有效Java的第二版第2項中對此模式進行了介紹。 JDK中已經添加了幾個構建器,包括J2SE 1.7中添加了Locale.Builder 。 在本文中,我將簡要介紹JDK 8附帶的 Calendar.Builder 。

如今,Java開發人員通常通過以下任一方法填充Calendar類的實例:

調用一個“ set”方法中的一個,該方法接受實例的一長串內容,或者通過依次調用該實例上的各個“ set”方法來實現。 接下來的兩個代碼清單演示了這兩種填充Calendar實例的典型方法。

使用單個“設置”方法填充日歷

/*** Demonstrate pre-JDK 8 method of instantiating Calendar instance using* "set" method for main fields.*/ public static void demoCalendarWithSingleSet() {final Calendar calendar =Calendar.getInstance(TimeZone.getTimeZone(timeZoneId),ENGLISH);calendar.set(2013, APRIL, 6, 15, 45, 22);out.println("Calendar via Constructor: " + stringifyCalendar(calendar)); }

使用多個單獨的“設置”方法填充日歷

/*** Demonstrate pre-JDK 8 method of instantiating Calendar instance using* individual "set" calls for each pair of field names and values.*/ public static void demoCalendarWithIndividualSets() {final Calendar calendar =Calendar.getInstance(TimeZone.getTimeZone(timeZoneId),ENGLISH);calendar.set(YEAR, 2013);calendar.set(MONTH, APRIL);calendar.set(DATE, 6);calendar.set(HOUR, 3);calendar.set(MINUTE, 45);calendar.set(SECOND, 22);calendar.set(AM_PM, PM);out.println("Calendar via set methods: " + stringifyCalendar(calendar)); }

旁注:在以上兩個示例中,我都使用了現代Java另一個日益流行的功能 : static import 。 諸如ENGLISH , YEAR和SECOND之類的常量實際上是從Locale和Calendar之類的類中靜態導入的。 正如我之前所寫 ,靜態導入在Java開發人員中似乎越來越流行,尤其是考慮到流暢接口的趨勢。

上面顯示的兩種“傳統”方法顯示了填充Calendar實例的不同方法。 一種極端情況是分別設置每個單獨的字段,而另一種極端情況是使用單個“設置”方法設置所有有效字段。 每種方法都有其優勢。 與多集方法相比,單一“集”方法具有“未完成”對象的狀態更少,但是多集方法更具可讀性,因為基于每個“集”的第一個參數,被設置值的名稱是明確的“ 方法。 單集方法有點笨拙,因為它需要六個整數,可以很容易地將它們混合在一起以按順序傳遞,因為除了隱式階數之外,沒有明顯的方法可以區分哪個整數是哪個整數。

Calendar.Builder利用Bloch所描述的Builder的廣告收益:消除了“在[對象的]構造過程中出現不一致狀態的情況”。 下一個代碼清單中對此進行了演示。

Calendar.Builder允許具有可讀設置的單語句實例化

/*** Demonstrate using JDK 8's Calendar.Builder to instantiate an instance of* Calendar using the set methods to set each field individually based on* field name and value.*/public static void demoCalendarWithCalendarBuilderSetFields(){final Calendar calendar =new Calendar.Builder().set(YEAR, 2013).set(MONTH, APRIL).set(DATE, 6).set(HOUR, 15).set(MINUTE, 45).set(SECOND, 22).setTimeZone(TimeZone.getTimeZone(timeZoneId)).setLocale(ENGLISH).build();out.println("Calendar via Calendar.Builder 'set' Fields: "+ stringifyCalendar(calendar));}

在上面的代碼清單中,創建了Calendar實例并將其填充在一條語句中,從而消除了使對象在多個語句中處于不一致狀態的風險。 此示例保留了傳統的單個“集合”方法方法[ set(int,int) ]的可讀性,并具有在實例化時立即完全填充對象的附加安全性。

對于希望提供較少的單個“設置”方法的開發人員, Calendar.Builder另一個機會是使用setDate(int,int,int)和setTimeOfDay(int,int,int)方法,如下面的代碼清單所示。

Calendar.Builder將日期和時間設置為兩個呼叫

/*** Demonstrate using JDK 8's Calendar.Builder to instantiate an instance of* Calendar using the "setDate" and "setTimeOfDay" builder methods.*/ public static void demoCalendarWithCalendarBuilderSetDaySetTime() {final Calendar calendar =new Calendar.Builder().setDate(2013, APRIL, 6).setTimeOfDay(15, 45, 22).setTimeZone(TimeZone.getTimeZone(timeZoneId)).setLocale(ENGLISH).build();out.println("Calendar via Calendar.Builder setDate/setTimeOfDay: "+ stringifyCalendar(calendar)); }

用這種方法鍵入的字符和行數較少,但是它部分地重新引入了一個缺點,即由于兩個方法中的每一個都使用三個整數,因此無意中切換了整數參數的可能性(或者setTimeOfDay()的重載版本將占用一個整數setTimeOfDay()代表毫秒的第四個整數)。

對于希望在實例化過程中指定Calendar參數時具有最大靈活性的開發人員, Calendar.Builder提供了setFields(int…)方法,該方法采用任意長度的整數對,其中整數對的第一個整數表示要設置的字段,第二個整數表示要設置的字段表示該字段值的一對整數。 在下一個代碼清單中使用此方法。

通過Calendar.Builder的setFields方法指定日歷字段

/*** Demonstrate using JDK 8's Calendar.Builder to instantiate an instance of* Calendar using the setFields method that allows providing of Calendar* fields as key/value pairs.*/public static void demoCalendarWithCalendarBuilderSetPairs(){final Calendar calendar =new Calendar.Builder().setFields(YEAR, 2013, MONTH, APRIL, DATE, 6, HOUR, 15, MINUTE, 45, SECOND, 22).setTimeZone(TimeZone.getTimeZone("timeZoneId")).setLocale(ENGLISH).build();out.println("Calendar via Calendar.Builder setPairs: "+ stringifyCalendar(calendar));}

此setFields(int ...)方法帶來更大的風險,可能會破壞用于實例化Calendar新實例的整數的順序,但是使用靜態導入的Calendar常數確實可以提高可讀性,并減少不正確混合整數的可能性。 如果提供了奇數個整數(表示不完整對),則拋出IllegalArgumentException 。

盡管Calendar.Builder在實例化和填充Calendar實例方面提供了一些便利,但是只要幸運地采用JDK 8,任何人都可以訪問新的日期/時間API ,因此可能會問“為什么使用Calendar.Builder?”。 也許最好的答案是,現在有成千上萬的現有代碼,庫線,和框架有使用,并期望Calendar的情況下,所以它可能是一個漫長的時間之前需要Calendar完全消失(如果有的話)。 幸運的是, Calandar.Builder使得可以通過CalendarBulder.setInstant(long)輕松將Instant ( 新Java數據/時間API的一部分)實例轉換成Calendar 。 下一個代碼清單中對此進行了演示。

使用Calendar.Builder將Instant轉換為Calendar

/*** Demonstrate using JDK 8's Calendar.Builder to instantiate an instance of* Calendar based on "now" Instant.*/public static void demoCalendarWithCalendarBuilderInstant(){final Calendar calendar =new Calendar.Builder().setInstant(Instant.now().toEpochMilli()).setTimeZone(TimeZone.getTimeZone(timeZoneId)).setLocale(ENGLISH).build();out.println("Calendar via Calendar.Builder and Instant: " + stringifyCalendar(calendar));}

請注意, setInstant方法的重載版本接受Date來實例化Calendar 。 在這兩種情況下,無論是使用setInstant(long)還是setInstant(Date)實例化,都不應調用Calender.Builder上的其他“ set”方法來避免IllegalStateException 。

使用Calendar.toInstant()可以很容易地朝另一個方向(從Calendar獲取Instant ) 。 JDK 1.8引入Calendar其他方法與提供當前實例的日歷類型 (作為字符串)或可用日歷類型集(字符串集)有關。 當我在系統上運行Calendar.getAvailableCalendarTypes()時,看到以下三個字符串:“ gregory ”,“ Japanese ”和“ buddhist ”(與“ Supported Calendars”中記錄的三個日歷相同)

結論

與許多Java開發人員一樣 ,我期待標準Java開發套件中內置的改進的Java數據/時間API。 但是,我也意識到,尤其是在大型代碼庫中,以及在使用期望使用Calendar或Date庫和框架時,我將在一段時間內無法擺脫Calendar和Date的困擾。 JDK 8中Calendar.Builder的引入減輕了這一負擔。

參考:來自JCG合作伙伴 Dustin Marx的JDK 8的Calendar.Builder,來自Inspired by Actual Events博客。

翻譯自: https://www.javacodegeeks.com/2013/05/jdk-8s-calendar-builder.html

jdk8 calendar

總結

以上是生活随笔為你收集整理的jdk8 calendar_JDK 8的Calendar.Builder的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。