最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java和Ceylon對象的構(gòu)造和驗證

 更新時間:2016年11月14日 13:58:13   作者:shanshuiss  
這篇文章主要為大家詳細介紹了Java和Ceylon對象的構(gòu)造和驗證,具有一定的參考價值,感興趣的小伙伴們可以參考一下

當變換Java代碼為Ceylon代碼時,有時候我會遇到一些Java類構(gòu)造器混淆了驗證與初始化的情形。讓我們使用一個簡單但是人為的代碼例子來說明我想闡述的意思。

一些壞代碼

考慮下面的Java類。(伙計,不要在家里寫這樣的代碼)

public class Period {
 private final Date startDate;
 private final Date endDate;
 //returns null if the given String
 //does not represent a valid Date
 private Date parseDate(String date) {
  ...
 }
 public Period(String start, String end) {
  startDate = parseDate(start);
  endDate = parseDate(end);
 }
 public boolean isValid() {
  return startDate!=null && endDate!=null;
 }
 public Date getStartDate() {
  if (startDate==null) 
   throw new IllegalStateException();
  return startDate;
 }
 public Date getEndDate() {
  if (endDate==null)
   throw new IllegalStateException();
  return endDate;
 }
}

嘿,我之前已經(jīng)警告過,它是人為的。但是,在實際Java代碼中找個像這樣的東西實際上并非不常見。

這里的問題在于,即使輸入?yún)?shù)(在隱藏的parseDate()方法中)的驗證失敗了,我們還是會獲得一個Period的實例。但是我們獲取的那個Period不是一個“有效的”狀態(tài)。嚴格地說,我的意思是什么呢?

好吧,假如一個對象不能有意義地響應公用操作時,我會說它處于一個非有效狀態(tài)。在這個例子里,getStartDate() 和getEndDate()會拋出一個IllegalStateException異常,這就是我認為不是“有意義的”一種情況。

從另外一方面來看這個例子,在設(shè)計Period時,我們這兒出現(xiàn)了類型安全的失敗。未檢查的異常代表了類型系統(tǒng)中的一個“漏洞”。因此,一個更好的Period的類型安全的設(shè)計,會是一個不使用未檢查的異?!谶@個例子中意味著不拋出IllegalStateException異常。

(實際上,在真實代碼中,我更有可能遇到一個getStartDate() 方法它不檢查null ,在這個代碼行之后就會導致一個NullPointerException異常,這就更加糟糕了。)

我們能夠很容易地轉(zhuǎn)換上面的Period類成為Ceylon形式的類:

shared class Period(String start, String end) {
 //returns null if the given String
 //does not represent a valid Date
 Date? parseDate(String date) => ... ;
 value maybeStartDate = parseDate(start);
 value maybeEndDate = parseDate(end);
 shared Boolean valid
  => maybeStartDate exists 
  && maybeEndDate exists;
 shared Date startDate {
  assert (exists maybeStartDate);
  return maybeStartDate;
 }
 shared Date endDate {
  assert (exists maybeEndDate);
  return maybeEndDate;
 }
}

當然了,這段代碼也會遇到與原始Java代碼同樣的問題。兩個assert符號沖著我們大喊,在代碼的類型安全中有一個問題。

使Java代碼變得更好

Java里我們怎么改進這段代碼呢?好吧,這兒就是一個例子關(guān)于Java飽受詬病的已檢查異常會是一個非常合理的解決方法!我們可以稍微修改下Period來從它的構(gòu)造器中拋出一個已檢查的異常:

public class Period {
 private final Date startDate;
 private final Date endDate;
 //throws if the given String
 //does not represent a valid Date
 private Date parseDate(String date)
   throws DateFormatException {
  ...
 }
 public Period(String start, String end) 
   throws DateFormatException {
  startDate = parseDate(start);
  endDate = parseDate(end);
 }
 public Date getStartDate() {
  return startDate;
 }
 public Date getEndDate() {
  return endDate;
 }
}

現(xiàn)在,使用這個解決方案,我們就不會獲取一個處于非有效狀態(tài)的Period,實例化Period的代碼會由編譯器負責去處理無效輸入的情形,它會捕獲一個DateFormatException異常。

try {
 Period p = new Period(start, end);
 ...
}
catch (DateFormatException dfe) {
 ...
}

這是一個對已檢查異常不錯的、完美的、正確的使用,不幸的是我?guī)缀鹾苌倏吹絁ava代碼像上面這樣使用已檢查異常。

使Ceylon代碼變得更好

那么Ceylon怎么樣呢?Ceylon沒有已檢查異常,因而我們需要尋找一個不同的解決方式。典型地,在Java調(diào)用一個函數(shù)會拋出一個已檢查異常的情形中,Ceylon會調(diào)用函數(shù)返回一個聯(lián)合類型。因為,一個類的初始化不返回除了類自己外的任何類型,我們需要提取一些混合的初始化/驗證的邏輯來使其成為一個工廠函數(shù)。

//returns DateFormatError if the given 
//String does not represent a valid Date
Date|DateFormatError parseDate(String date) => ... ;
shared Period|DateFormatError parsePeriod
  (String start, String end) {
 value startDate = parseDate(start);
 if (is DateFormatError startDate) {
  return startDate;
 }
 value endDate = parseDate(end);
 if (is DateFormatError endDate) {
  return endDate;
 }
 return Period(startDate, endDate);
}
shared class Period(startDate, endDate) {
 shared Date startDate;
 shared Date endDate;
}

根據(jù)類型系統(tǒng),調(diào)用者有義務去處理DateFormatError:

value p = parsePeriod(start, end);
if (is DateFormatError p) {
 ...
}
else {
 ...
}

或者,如果我們不關(guān)心給定日期格式的實際問題(這是有可能的,假定我們工作的初始化代碼丟失了那個信息),我們可以使用Null而不是DateFormatError:

//returns null if the given String 
//does not represent a valid Date
Date? parseDate(String date) => ... ;
shared Period? parsePeriod(String start, String end)
 => if (exists startDate = parseDate(start), 
   exists endDate = parseDate(end))
  then Period(startDate, endDate)
  else null;
shared class Period(startDate, endDate) {
 shared Date startDate;
 shared Date endDate;
}

至少可以說,使用工廠函數(shù)的方法是優(yōu)秀的,因為通常來說在驗證邏輯和對象初始化之間它具有更好的隔離。這點在Ceylon中特別有用,在Ceylon中,編譯器在對象初始化邏輯中添加了一些非常嚴厲的限制,以保證對象的所有領(lǐng)域僅被賦值一次。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • maven的pom.xml中profiles的作用詳解

    maven的pom.xml中profiles的作用詳解

    這篇文章主要介紹了maven的pom.xml中profiles的作用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot程序啟動慢-未配置hostname的解決

    springboot程序啟動慢-未配置hostname的解決

    這篇文章主要介紹了springboot程序啟動慢-未配置hostname的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MDC在多線程中的使用方式

    MDC在多線程中的使用方式

    這篇文章主要介紹了MDC在多線程中的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 關(guān)于IntelliJ IDEA 打包代碼報錯的問題

    關(guān)于IntelliJ IDEA 打包代碼報錯的問題

    這篇文章主要介紹了關(guān)于IntelliJ IDEA 打包代碼報錯的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spring容器注冊組件實現(xiàn)過程解析

    Spring容器注冊組件實現(xiàn)過程解析

    這篇文章主要介紹了Spring容器注冊組件實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Java中的數(shù)組基礎(chǔ)知識學習教程

    Java中的數(shù)組基礎(chǔ)知識學習教程

    這篇文章主要介紹了Java中的數(shù)組基礎(chǔ)知識學習教程,文中同時也整理了Java對數(shù)字類型的支持狀況及Number類中的方法,需要的朋友可以參考下
    2016-02-02
  • Java中Quartz高可用定時任務快速入門

    Java中Quartz高可用定時任務快速入門

    如果你想做定時任務,有高可用方面的需求,或者僅僅想入門快,上手簡單,那么選用它準沒錯,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳細聊聊RabbitMQ竟無法反序列化List問題

    詳細聊聊RabbitMQ竟無法反序列化List問題

    這篇文章主要給大家介紹了關(guān)于RabbitMQ竟無法反序列化List的相關(guān)資料,文中通過示例代碼將問題以及解決的過程介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2021-09-09
  • Java中spring boot validation自定義注解使用方式

    Java中spring boot validation自定義注解使用方式

    這篇文章主要介紹了Java中spring boot validation自定義注解使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java歐拉函數(shù)的計算代碼詳解

    Java歐拉函數(shù)的計算代碼詳解

    這篇文章主要介紹了Java實現(xiàn)歐拉函數(shù)的計算,從歐拉函數(shù)引伸出來在環(huán)論方面的事實和拉格朗日定理構(gòu)成了歐拉定理的證明,本文通過實例代碼給大家介紹的很詳細,需要的朋友可以參考下
    2021-05-05

最新評論

仪征市| 巩义市| 甘孜| 靖西县| 宜兰县| 广河县| 什邡市| 长春市| 大关县| 黄石市| 东宁县| 怀远县| 福安市| 宜州市| 新津县| 南澳县| 赤城县| 阿拉尔市| 合山市| 武冈市| 陆良县| 徐闻县| 修水县| 宜昌市| 沙洋县| 新余市| 安顺市| 凤城市| 徐州市| 临沭县| 博客| 讷河市| 南溪县| 株洲县| 华阴市| 济阳县| 阜平县| 新疆| 保定市| 绥棱县| 普定县|