4

EA UML クラス図から Java コードを生成しようとしています。私は 2 つのクラスを定義し、それらには構成関係シップがあります。

たとえば、クラス A にはクラス B のリストが含まれています。

[コード生成] ダイアログ ボックスで既定のコレクション クラスを List に設定すると、次のようにコードが正しく生成されます。

class B {
 public List<B> m_B;
};

しかし、インポートステートメントを自動的に生成することはできません。以下のように:

import java.util.List;
class B {
 public List<B> m_B;
};

コード生成ダイアログ ボックスに完全なインポート ステートメントを指定できるセクションがあることは知っていますが、多くのクラスがあり、EA にインポート ステートメントを自動的に生成させたいと考えています。

コード テンプレートもいじりましたが、コード テンプレートにハードコードされた import ステートメント以外のものをインポートすることはできませんでした。

マクロ

importPackagePath
importClassName

空いているようです。

コードテンプレートを変更して、実行するインポートを理解するのを手伝ってくれる人はいますか?

ありがとう、

よろしく、

ヴィマル

4

1 に答える 1

7

コード生成テンプレートを避けるべきだと思います。ここでの問題は、コレクション クラスの処理が通常のコード生成から外れていることです。クラスに別のパッケージ内のクラスの型を持つメンバーがある場合、EA は正しいインポート ステートメントを生成しますが、そのクラスがモデル内に存在し、コレクション クラスが存在しない場合のみです。

これを回避するには、次の 3 つの方法があります。

1) 生成されたコードが壊れていることを受け入れます。

コードを生成し、それを IDE (NetBeans、Eclipse、または使用しているもの) で開き、知識に基づいて正しいインポート ステートメントを追加します。

これは迅速かつ簡単ですが、結果を確認する必要があります。リスクもあります。「B」クラスが「List」クラスを含むパッケージをインポートする場合、コンパイラは文句を言いませんが、参照された「List」クラスは java.util のものではありません。あなたが思っていたコードを取得していません。

2) コレクション クラスをモデル化します。

子「util」とテンプレート クラス「List」を含むパッケージ「java」を作成し、モデルを変更して、B との 0..* 関係ではなく、A がこの「List」タイプとの関係が「1」になるようにします。 (B ではない) ですが、タイプ B でインスタンス化されています。これに対する正しい関係は、テンプレート バインドです。

コレクション クラスをモデル化する方法として、プロジェクトに rt.jar をインポートします。ただし、これには非常に時間がかかるため、自動ダイアグラム生成を無効にしてください。そうしないと、メモリが不足する可能性があります。ただし、すべてのユーティリティ クラスを一度だけインポートすることになります。

安全を確保したい場合は、コレクション クラスを Java オプション ([ツール] - [オプション] - [ソース コード エンジニアリング] - [Java]) から削除して、EA がそれらを使用しないようにします。ただし、すべての関係を変更すると、EA は構成されたコレクション クラスを使用しなくなります。

これにより、最も正しいモデルが得られ、他のユーティリティ クラス (Calendar など) を参照する方法の問題も解決されますが、コレクション クラスのない大きなモデルを取得した場合は、多くの作業が必要になる可能性があります。

3) コレクション クラスに完全修飾名を使用します。

Java オプションで、代わりList<#TYPE#>java.util.List<#TYPE#>. 型が完全修飾名で参照される場合、Java コンパイラは import ステートメントを必要としません。

これは非常に迅速かつ簡単で、生成されたコードは正しいものです。欠点は、コードが少しかさばることです。

コレクションクラスだけが機能する必要がある場合は、これを使用します。他の一般的なユーティリティ クラスを参照したい場合は、rt.jar をインポートしてモデルを作り直してください。

于 2012-07-27T10:11:58.650 に答える