Creo Elements/Direct Model Manager カスタマイズガイド > Java 拡張 > Java API > カスタマイズコードの Java Generics への移行
カスタマイズコードの Java Generics への移行
Creo Elements/Direct Model Manager 20.7 の実装では、Java 5 で導入された Java Generics が多用されています。Java Generics を使用することで、型の安全性が向上し、理解しやすい API を実現できます。Generics を使用していないカスタマイズコードも、新しいタイプのインターフェイスと、コンパイル時および実行時の互換性がありますが、Java Generics を使用した Java カスタマイズへの移行を強くお勧めします。
場合によっては、メソッドの署名を変更する必要があります。
このページでは、Java Generics に移行するためのガイドラインおよびヒントを提供します。
ステップ 1 - Creo Elements/Direct Model Manager 20.7 をインストールする前の準備:
このステップの重要な点として、スーパークラスでメソッドの署名が変更された場合は常に実行します。これを行うには、不足している @Override アノテーションをカスタマイズコードに追加する必要があります。不足している @Override アノテーションをカスタマイズコードに追加する場合、NetBeans IDE を使用して手動で行うか、Eclipse IDE を使用して自動で行うことができます。
1. NetBeans IDE を使用する場合
a. 「Tools」 > 「Options」 > 「Editor」の順にクリックします。
b. 「Hints」をクリックします。
c. 「Standard Javac warnings」 > 「Overrides」の順にクリックし、「Show As」「Error」に設定します。
d. 「OK」をクリックします。
e. 「Window」 > 「Task List」の順にクリックします。
f. 不足している @Override アノテーションがタスクリストにエラーとして表示されます。
g. 不足している @Override アノテーションをすべて追加します。
2. Eclipse IDE を使用する場合
a. ソースコード用にプロジェクトをセットアップします。
b. 「Java Browsing view」をクリックします。
c. プロジェクトのポップアップメニューで、「Source」 > 「Clean Up」の順にクリックします (my-src のポップアップメニューで「...」をクリック)。
d. 「Use custom profile」を選択します。
e. 「Configure」をクリックします。
f. すべてのタブですべてのクリーンアップオプションを無効にします。
g. 「Missing Code」をクリックします。
h. 「Add missing Annotations」を有効にします。
i. '@Override' を有効にします。
j. 「OK」をクリックします。
k. 「Clean Up」ダイアログボックスで「Finish」をクリックします。
l. 不足している @Override がすべて追加されました。
ステップ 2:
Creo Elements/Direct Model Manager 20.7 に対してカスタマイズコードをコンパイルします。
this method does not override a method of the base class というタイプのエラーが表示された場合は、スーパークラスのメソッドの署名が変更され、それに応じたコードが採用されているかどうかをチェックしてください。
ステップ 3:
未加工型ではなく、Generics を使用したカスタマイズコードに変更します。たとえば、未加工型の List ではなく、List<WMUserObject> を使用します。
ヒント 1:
WMElement.getChildren() などの戻り型は、List<WMUserObject> となっています。子に対してイテレーションを適用する場合、型のチェック (instanceof) を行わずに WMUserObject をキャストすることは避けてください。代わりに、新しく追加された便利なメソッドである WMObject.getFilteredList(...) を使用して、目的とする型の子オブジェクトを取得できます。
次に例を示します。
final List<Part> partList = WMObject.getFilteredList(wmElement.getChildren(), Part.class);
for(final Part part : partList) {
...
}
ヒント 2:
WMSession.close(..) の署名は、WMClosable のコレクションのみを受け入れるように変更されました。このメソッドが、未加工型を使用してコールされることはありません。
ヒント 3:
リビジョンの型は、整合性を保つために String に変更されました。たとえば、Versionable.setMinorRef(...) の署名は、それに応じて変更されています。
ヒント 4:
WMElement.getChildren() が、内部的に保持された子オブジェクトのリストを常に返すという事実に基づいて、リストを編集することは避けてください。このメソッドは内部的なリストのコピーを返す場合があります。内部的な子を編集する必要がある場合は、getChildren() を呼び出し、リストを編集して、編集したリストを setChildren(...) でセットします。
ヒント 5:
信頼できないキャストは使用しないでください。たとえば、次のことは避けるようにします。
final List list = versionable.getVersionables();
for(Object obj : list) {
WMElement e = (WMElement) obj;
...
}
次のように、ユーティリティメソッド WMObject.getFilteredList(...) を使用して、安全な型のリストを取得するようにしてください。
final List<WMElement> list = WMObject(versionable.getVersionables(), WMElement.class);
for(final WMElement wmElement : list) {
...
}
ヒント 6:
ActionMenuModel のメソッド addSection() および getMenuItem() は、List を返すようになりました。Creo Elements/Direct Model Manager 17.0 より前は、これらのメソッドは JMenuItem および WMAbstractAction オブジェクトで構成されたリストを返していました。Creo Elements/Direct Model Manager 17.0 では、WMAbstractAction オブジェクトは WMActionMenuItem でラップされます。
次に例を示します。
menuItems.add(1, new WMActionMenuItem(new MasterDataPlotAction()));
ヒント 7:
WMClientNavigationPanel での getTree()getTable()、および getRowHeaderTable() の戻り型が変更されました。
ヒント 8:
Clone メソッド (たとえば、WMDefaultMenu) は、Object ではなく、対応するオブジェクトの型を返すようになりました。
次に例を示します。
@Override
protected WMDefaultMenu clone( ) {
...
}
ヒント 9:
com.osm.biz.UserComparator の名前は com.osm.biz.WMUserObjectComparator に変更されています。
ヒント 10:
引数で渡されたリストの要素を処理するだけのメソッドでは、Generics でワイルドカードを使用することによって、柔軟に対応できる場合があります。
次に例を示します。
public void processList(List<? extends WMElement> list) {
...
}
instead of
public void processList(List<WMElement> list) {
...
}
最初の署名で渡すこともできます (たとえば、List<Drawing>List<Model>)。2 番目の署名では List<WMelement> が必要です。
これは役に立ちましたか?