溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的DataObject怎么用

發布時間:2022-01-05 17:51:27 來源:億速云 閱讀:444 作者:iii 欄目:編程語言

這篇文章主要介紹“Java的DataObject怎么用”,在日常操作中,相信很多人在Java的DataObject怎么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java的DataObject怎么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

數據對象

數據對象用于描述業務數據,數據對象利用屬性保存數據。

數據對象接口的設計原則是:使編程更為簡單,因為它提供了對所有普通類型的業務數據的訪問以及各種訪問模式的支持,如基于名字、索引和路徑進行訪問。

數據對象接口包含以下方法:

  • 獲取和設置數據對象的屬性;

  • 查詢一個屬性是否是集合;

  • 創建一個新的被包含的子數據對象實例;

  • 從數據對象的容器刪除該數據對象;

  • 從數據對象的容器分派該數據對象;

  • 獲取數據對象的容器及其包含的屬性;

  • 獲取根數據對象;

  • 獲取數據對象所屬的數據圖;

  • 獲取數據對象的類型;

  • 獲取數據對象的順序(如果存在的話);

  • 獲取數據對象的額外屬性(如果存在的話);

對于許多不使用生成代碼的應用而言,數據對生成象接口是唯一用來編寫應用的SDO部件。對于那些使用生成代碼的應用來說,將直接使用生成的接口。SDO的其它部件主要根據用戶需要加以使用。

數據對象概念

數據對象可以分為以下幾類。在分類過程中,開放(open)或順序(sequenced)概念能夠獨自或一起使用。

  1. Basic。數據對象和一個每個屬性都有一個賦值域的JavaBean類似。所有允許的屬性集合可以通過getType().getProperties()方法獲得。通過get(property)方法可以訪問屬性的值。屬性內部的順序是可以維護的,但是跨越多個屬性之間的順序是不可維護的。

  2. Open。數據對象和一個容許有額外屬性的JavaBean類似。在XML中,這等同于開放(通配符)內容。它類似于一個和新屬性擁有額外映射的JavaBean。額外屬性不是由getType().getProperties()方法返回屬性的一部分。通過使用getInstanceProperties()方法,能夠獲得一個特殊數據對象的實際擁有的屬性。屬性值可以使用get(property)方法訪問。屬性內部的順序是可以維護的,但是跨越多個屬性之間的順序是不可維護的。

  3. Sequenced。數據對象和一個能夠同時維護屬性內部和屬性之間順序的JavaBean類似。在XML中,這等同于一個DOM。在使用XML時,Sequence表示了數據對象內部所有XML元素的順序。使用get(property)方法可以獲得屬性值,但是維護跨越多個屬性之間的順序,則需要通過順序interface. getSequence()方法返回XML實例的所有XML元素的Sequence進行。XML屬性沒有順序的概念并且可以通過get(property) 方法進行訪問。

數據對象的值和屬性

數據對象擁有給其屬性所賦的數據值。例如,一個采購訂單數據對象的orderDate屬性有一個值為:2005-6-30。通過使用數據對象的get("orderDate") set("orderDate")方法,可以獲取或修改其orderDate屬性的值。當使用生成的代碼時,也可以通過使用PurchaseOder接口上的getOrderDate() setOrderDate()方法訪問屬性的值。

在數據對象接口上,可以基于屬性的名字通過使用get(String path)方法訪問屬性值,也可以利用屬性的索引或者直接利用屬性對象訪問屬性值。數據對象的get(String path)方法可以使用別名,也可以使用路徑里的屬性名。在這里,路徑可能僅僅是一個屬性的名字,也有可能是一個基于XPath子集的路徑表達。

類型轉換

有時屬性的類型會和應用程序中習慣使用的類型不同。例如,當在用戶界面中顯示一個整型數量時,字符串型可能比整型表達更有效??梢苑奖愕脑L問整型數量屬性的getString(“quantity”)方法將會返回一個字符串類型的值。在許多應用中,這使一個常用的任務得以簡化。

在調用一個數據對象的類型訪問器(accessorgetset時,如果值不是請求所需要的類型T的實例,則必須進行類型轉換。類型轉換由數據對象的實現自動完成。SDO實現被期望能夠實現任何數據類型與數據對象內定義的類型之間的轉換,并且在轉換過程中盡可能不丟失信息。所支持的數據類型在SDO DataTypes片段中定義。這些類型包括:

  • Java基本類型;

  • Java基本類型的對象包裝;

  • String;

  • Date和時間類型;

  • URI;

  • Byte[];

  • BigDecimal;

  • BigInteger;

JavaDataHelper描述了類型轉換。本規范145頁“DataType Conversions”中說明了所支持的類型轉換。

多值(Many-Valued)數據對象屬性

屬性可能有一個或多個值。如果一個屬性是多值的,那么property.many返回true,get(property)方法將返回一個列表(List)。

在數據接口或自動生成的代碼上,當屬性沒有值時,返回值為List的數據對象方法將返回一個空列表而不是返回一個null。返回的列表可以描述數據對象的值的任何變化。

對于訪問多值屬性來說,getList(property)訪問器是極其方便的。如果property.manytrue,那么set(property, value)setList(property, value) 方法需要“value”分別為java.util.CollectionList對象。這些方法和在使用完getList(property).clear()之后緊接著使用getList(property).addAll(value)方法效果一樣。

對于多值屬性,get()getList()方法將返回一個包含當前值的列表List。通過List接口立即可以對數據對象的當前值進行更新操作。每次使用get()getList()方法訪問時,都將返回同一個List對象。

判斷一個屬性是否是集合

對于一個多值屬性,isSet(property)方法將返回:

  • True,如果List不為空;

  • False,如果List為空;

對于一個單值屬性,isSet(property) 方法將返回:

  • False,如果Property還沒有被set()或者已經被 unset()了;

  • True,如果當前值不是Property的缺省值;

  • 對于某些實例,實現基于下列策略決定isSet(property)的值:

  • 調用set()之后而沒有調用unset(),isSet()返回True。在set(property, property.getDefault())之后,isSet(property)返回True;

  • 當前值不等于缺省值時,isSet()返回true;在set(property, property.getDefault())之后,isSet(property)返回false。

unset(property)訪問器可以用來清空一個簡單屬性,因此在unset(property)之后,isSet(property)返回false,get(property)返回缺省值。delete()方法將取消數據對象的所有屬性的值,除非該屬性為只讀屬性。在unset()之后,get(property)將返回缺省值,對于多值屬性,則返回一個空列表。

注意:試圖使用set,unset或者delete修改一個只讀屬性將會引發一個異常。

包含內容(Containment

數據圖內的數據對象被組織成一個樹型結構。有一個數據對象作為樹的根節點,而其它數據對象則組成這個樹的其它葉子節點。

通過使用由根數據對象開始的包含內容引用(containment references)就可以創建一個樹型結構。根數據對象引用其它數據對象,而這些數據對象則可以進一步引用更深一層的數據對象。除了根數據對象,數據圖內的每一個數據對象必定有一個從樹內其它節點而來的包含內容引用。圖內的每一個數據對象可以跟蹤它的包含內容引用的位置。

對于一個數據圖來說,擁有一個非包含內容引用(containment references)是可能的。這些引用所指向的數據對象是同一個數據圖的一部分(引用的數據對象必定是同一個樹的一部分),但是這些引用對該數據圖的樹型結構沒有影響。

包含內容和非包含內容都是數據對象的屬性。該屬性的類型可以是任何一種數據對象類型。

一個特殊的數據對象引用屬性是否是一個包含內容引用或非包含內容引用由該數據圖的數據模型定義,例如定義一個XML文檔數據類型的XSD。一旦數據模型被定義好后,將不能被修改??梢酝ㄟ^訪問property.containment來查詢一個特殊的引用是否是一個包含內容引用。

容器型數據對象包含其它數據對象。數據對象能夠擁有一個容器數據對象的最大數目。如果一個數據對象沒有容器,那么它就是一個根數據對象。

getContainer()getContainmentProperty()方法提供了自上而下的簡單瀏覽數據對象所包含的內容的方法。getContainer()方法返回一個父數據對象,getContainmentProperty()方法返回包含該對象的容器屬性。使用detach()方法,在不做任何改變的情況下,可以將一個數據對象能夠從它的容器中移出。

包含內容可以被管理。當一個數據對象作為一個包含內容屬性的值被設置或添加時,它將被從先前的任何一個包含內容屬性中移出。包含內容不可能有循環。如果設置或添加將生成一個循環,一個異常將會拋出。

創建和刪除數據對象

創建方法可以創建一個該屬性所屬類型的數據對象,或者創建一個在參數中說明的類型的數據對象,并且能夠將一個創建好的數據對象添加到指定的屬性。如果數據對象的類型是一個順序型(getType().isSequenced()方法返回true),新創建的數據對象將被添加在順序的末尾。如果屬性是單值的,屬性的值將被設置為該新創建的對象。如果屬性是多值的,新創建的對象將被作為最后一個對象而添加。只有包含內容屬性能夠被用來創建對象。一個新創建的對象的所有屬性都被取消(未賦值或僅是缺省值)。

delete()方法取消了數據對象的所有非只讀屬性。如果包含內容屬性不是只讀的,delete()方法也將把該數據對象從包含其的數據對象中移出。包含內容屬性所包含的遞歸的子數據對象也將被刪除。

如果其它數據對象有一個單步的或非包含內容屬性指向已刪除的數據對象,那么這些引用將不會被修改。然而為了滿足數據圖的封閉特性,上述屬性的值需要改變。一個被刪除的數據對象能夠被再次使用,并且能夠被再次添加到數據圖中。

順序型數據對象

數據對象可能是順序型的或非順序型的。getType().isSequenced()方法可以告訴你該數據對象的類型是否是順序型的。

如果數據對象的類型是順序型的,那么getSequence()方法將會返回一個順序(Sequence),否則getSequence()方法返回null。

數據對象的順序和表達其屬性值的XML元素一致。如果更新一個數據對象的話,那么從該數據對象返回的列表或順序,也進行同樣的數據操作。

返回的順序可以有效的描述數據對象值的任何變化。

開放內容的數據對象屬性

數據對象有兩種類型的屬性:

  • 由類型(Type)說明的屬性;

  • 不是由類型(Type)說明的屬性,這樣的屬性叫做開放內容(open content);

與數據對象類型相關的屬性可以通過getType().getProperties()方法獲得,該方法將返回一個列表。

除了擁有由類型描述的屬性之外,數據對象還能夠擁有其它屬性:

  • 處理開放的或者混合的XML內容。

  • 動態的遭遇新的屬性。

Type.opentrue時,允許擁有開放內容屬性。一些類型將開放(open)設置為false,因為它們不能接受附加的屬性。

一個屬性如果出現在getInstanceProperties()方法返回值中而不是出現在getType().getProperties()方法的返回值中,那么該屬性來源于開放內容。如果一個屬性來源于開放內容,那么isSet(property)方法必定返回true。

如果equals()方法為true的話,由DataType Types說明的屬性可以返回不同的對象。對于多變的數據值(例如,日期型或字符串列表),對這些值進行修改直接由實現決定。

當你使用getInstanceProperties()方法時,將返回一個只讀的列表,里面包含一個數據對象當前所使用的所有屬性。這包括開放內容的屬性。屬性的順序由所有getType().getProperties()方法返回值開始;其它屬性的順序由實現決定。每一次對getInstanceProperties()方法的調用將返回同一個列表對象,除非該數據對象已經更新,從而導致列表內容改變。

在一個實例屬性中,通過調用getProperty()方法并基于屬性名就能夠有效的查找數據對象上對應的屬性。

為了設置一個該屬性尚未設置(其并未出現在getInstanceProperties()方法返回值中)的開放內容值,一個數據對象的設置或創建訪問器,或者在列表或順序中添加,一個屬性的參數將要被使用,該參數可以通過訪問TypeHelper或者 XSDHelper查找到。創建一個開放內容的例子可以在135“Creating open content XML documents”中找到。

對于所有通過getInstanceProperties()方法獲得的開放內容屬性,其isSet(property)方法將返回真。

屬性索引

當一個數據對象擁有多個屬性時,每一個屬性都能夠被一個數字索引所引用,其中第一個屬性的數字索引從0開始。

get(int property)方法中使用的屬性索引是該屬性在getInstanceProperties()方法返回的列表中的位置。

如果數據正在修改之中,不推薦對開放內容使用索引參數訪問器;除非該索引被用在getInstanceProperties()方法獲得的屬性中,因為在getInstanceProperties()方法中,開放內容的屬性索引能夠改變,如果幾個開放內容屬性的值能夠被重復的設置和取消設置。

下面的例子是正確的,因為索引和getInstanceProperties()方法一起使用。注意由于數據對象不是同步的,因此用戶不應該在讀的同時對其進行更新操作。該實例顯示了一個普通的模式,在所有實例屬性中循環并且打印屬性名和值:

for (int i=0; i

{

Property p = (Property) myDo.getInstanceProperties().get(i);

System.out.println(p.getName()+"="+myDo.getString(i));

}

getInstanceProperties()方法獲得的屬性的名稱和別名與那些擁有較高的索引的屬性相比,具有一個較高的優先級,因此開放內容屬性可以通過使用類型屬性中定義的名稱隱藏其真實名稱,因為這些屬性在列表的開始。優先級的順序就是getInstanceProperties()方法返回值中的順序。

在一個復制名稱的事件中,開放內容屬性可以通過它的別名訪問,前提條件是該別名和已有其它屬性的名稱、別名不沖突。

數據對象的當前狀態(current state

數據對象的current state包含所有用來區分其與由DataFactory創建的新對象的值,因為由DataFactory新創建的對象還沒有屬性集合和容器。數據對象的當前狀態是getInstanceProperties()方法返回值中所有isSet()為真的屬性。容器和包含內容屬性是包含該數據對象的數據對象的狀態的一部分。下列程序將打印出數據對象myDO的當前狀態:

for (int i=0; i

{

Property p = (Property) myDo.getInstanceProperties().get(i);

if (myDo.isSet(p))

{

System.out.println(p.getName()+"="+myDo.getString(i));

}

}

數據對象接口

public interface DataObject extends Serializable

{

Object get(String path);

void set(String path, Object value);

boolean isSet(String path);

void unset(String path);

到此,關于“Java的DataObject怎么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女