リファクタとは、プログラムの動作を変更することなくコード構造を変更する編集上の技術です。「リファクタ」は、プログラムのソース・コードを変更して保持、拡張または再利用しやすくする場合に役立ちます。
この章の内容は次のとおりです。
通常は、Javaソース・エディタを使用してJavaコードの作成または編集を行います。これには、コーディングの強化を目的としたJava固有の機能が組み込まれています。たとえば、JDeveloperでは、事前定義コード・テンプレートを使用したコーディング、Javadocコメントの追加、ユーザーのコードへのフォーマット追加でさえも容易に実行できます。これらの機能は、コンテキスト・メニューまたは「ソース」メイン・メニューから使用できます。詳細は、「ソース・エディタの使用」を参照してください。
Javaソース・エディタの動作は、「プリファレンス」ダイアログでプリファレンスを指定することでカスタマイズできます。詳細は、「ソース・エディタのプリファレンスの設定方法」を参照してください。
JDeveloperには、生産性の向上に役立つJava対応編集機能が数多く用意されています。プロジェクトのクラスとインタフェースおよびそのメンバーのソース・コードを検索し、その場所に移動するための機能があります。JDeveloperには、Javaソース・エディタでクラス定義のメンバーからメンバーまでステップ実行できるキーボード・アクセラレータも組み込まれています。
JDeveloperでの作業中、JDeveloperダイアログを使用して、またはJavaソース・エディタで開いているファイルから直接、Java要素を参照できます。特定タイプのソース・コードまたはJavadocの検出も可能です。
プロジェクトのソース・パスにあるクラスのソースが表示されます。ライブラリにソースが含まれている場合は、プロジェクト・ライブラリにあるクラスのソースも表示されます。
Javaソース・エディタでの作業中、任意の識別子の宣言を簡単に検索できます。
コード要素の宣言に移動するには、次のようにします。
コード要素を右クリックし、「宣言に移動」を選択します。または、
[Ctrl]を押しながら、コード要素を左クリックします。
選択した要素のソース・コードが開き、宣言文がハイライト表示されます。
図8-2 強調表示された宣言
宣言が同じファイルにある場合は、カーソルがその宣言まで移動して、強調表示されます。宣言が別のファイルにある場合は、Javaソース・エディタ内でソース・ファイルによって宣言が開かれます。カーソルがその宣言まで移動して、強調表示されます。
Javaソース・エディタでの作業中、クラスやインタフェースへの参照およびそのメンバーを簡単に検索できます。デフォルトでは、現在のプロジェクトおよび依存プロジェクトの使用方法が報告されます。ライブラリのソース・ファイルにアクセス可能な場合は、検索対象をライブラリにまで拡大できます。
クラスの使用方法を検索するには、次のようにします。
このダイアログを使用すると、Javaソース・エディタで作業するとき、メソッドへの参照を迅速に検索できます。
検索によって、メソッドが定義されているクラスまたはインタフェースのインスタンスへの適用が表示されます。また、メソッドを継承するサブクラスまたはサブインタフェースが存在する場合は、それらのインスタンスへの適用も表示されます。
メソッドの使用方法を検索するには、次のようにします。
Javaソース・エディタでの作業中、フィールドへの参照を簡単に検索できます。
検索によって、メソッドが定義されているクラスまたはインタフェースのインスタンスに存在するフィールドの参照が表示されます。また、そのフィールドを継承するサブクラスまたはサブインタフェースが存在する場合は、それらのインスタンスの参照も表示されます。
フィールドの使用方法を検索するには、次のようにします。
Javaソース・エディタでの作業中、メソッド本体のローカル変数またはパラメータへの参照を簡単に検索できます。抽出したコードで使用されていたローカル変数およびパラメータは、新しいメソッドのパラメータになります。
ローカル変数またはパラメータの使用方法を検索するには、次のようにします。
Javaソース・エディタでの作業中、スーパークラスの定義をオーバーライドまたは実装するメソッドを特定できます。オーバーライドする定義には、図8-3に示すように、「オーバーライド」上矢印アイコンが付きます。
図8-3 「オーバーライド」アイコン
オーバーライド済の定義には、図8-4に示すように、Javaソース・エディタのマージンに「実装」マージン・アイコンが付きます。
図8-4 「実装」アイコン
オーバーライドされたメソッド定義を表示するには、マージンの 「オーバーライド」 アイコンをクリックします。オーバーライドされたメソッド定義を表示するには、マージンの 「実装」 アイコンをクリックします。
「メイン・ツールバー」の「戻る」ボタンをクリックすると、前のビューに戻ります。
Javaソース・エディタでの作業中、クラスまたはインタフェースのサブタイプおよびスーパータイプの階層をインスペクトできます。
エディタには、ノードのGUI階層全体が表示されます。表示の方法は、この階層がメニュー項目またはメニュー以外の項目のどちらで構成されるかによって異なります。
キーボード・アクセラレータを使用すると、Javaソース・エディタで、クラス定義内でメンバー間を移動できます。
現在のJavaソース・ビューの次のメンバー定義または宣言に移動するには、[Alt]キーを押しながら[↓]キーを押すか、または「ナビゲート」→「次のメンバーに移動」を選択します。
現在のJavaソース・ビューの1つ前のメンバー定義または宣言に移動するには、[Alt]キーを押しながら[↑]キーを押すか、または「ナビゲート」→「前のメンバーに移動」を選択します。
次のコード実行コマンドも定義されますが、デフォルトのアクセラレータには割り当てられないため、次の「ナビゲート」メニューから利用できません。
次のクラスに移動
次のフィールドに移動
次のメソッドに移動
前のクラスに移動
前のフィールドに移動
前のメソッドに移動
これらのコマンドは、「プリファレンス」ダイアログの「ショートカット・キー」ページの「ナビゲート」カテゴリにリストされます。アクセラレータは追加または変更できます。詳細は、「IDEでのショートカット・キーの使用方法」を参照してください。
JDeveloperには、生産性の向上に役立つJava対応編集機能が数多く用意されています。グラフィカル・ユーザー・インタフェースを開発する場合は、テキスト編集のかわりにJava Visual Editorを使用できます。ソース・エディタとビジュアル・エディタは同期しているため、片方を変更すると、ただちにもう一方に反映されます。これらのJava編集機能によって、あらゆるテクノロジのコーディングをサポートする汎用ソース編集機能が強化されています。
新規のクラスまたはインタフェースを作成する前に、まずアプリケーションとプロジェクトを作成する必要があります。クラスまたはインタフェースが作成されると、それはアクティブなプロジェクトに追加され、デフォルトではJavaソース・エディタに表示されます。また、「アプリケーション」ウィンドウでそれにアクセスすることもできます。
新規クラスを作成し、プロジェクトに追加するには、次のようにします。
ソース・エディタでは、フレームワーク・コードを追加し、インタフェースを実装するターゲット・クラスを変更したり、ターゲット・インタフェースを別のインタフェースに簡単に拡張できます。
implements
句またはextends
句がターゲット・クラスまたはターゲット・インタフェースの宣言に追加され、import文がファイルに追加されます。ターゲットがクラスである場合には、実装されるインタフェースの各メソッドについてスタブ定義がクラスまたはインタフェースの本体に追加されます。
インタフェースを実装するには、次のようにします。
ソース・エディタでは、スーパークラスから継承したメソッドをオーバーライドするためのスタブ定義をクラスに迅速に追加できます。オーバーライドするサブクラスによってメソッドの特定の実装が指定されますが、これはそのスーパークラスの1つですでに指定されています。
メソッドをオーバーライドする手順は次のとおりです。
ラムダ式では、1つのメソッドのみが含まれる匿名内部クラスのインスタンスを、よりコンパクトなフォームで表現するためのメカニズムが用意されているため、コーディングを簡略化できます。このようなクラスは機能インタフェースになるという要件を満たす場合にのみ変換できます。つまり、ラムダ式がメソッドへの引数として使用されるときに、タイプがメソッド・パラメータに使用できるような場合です。
注意:
この機能は、プロジェクトのターゲットJDKとしてJDK 1.8を指定した場合にのみ利用できます。
内部クラスをラムダ式に変換するには:
Javaソース・エディタで、変換する匿名クラスを選択します。
IDEはコードを解析して、コード・アシストが適用可能かどうかを確認します。
エディタのマージンに表示されるコード・アシスト・アイコンをクリックします。
コード・アシストの「匿名内部クラスをラムダ式に変換します」をクリックします。
ラムダ式で内部クラスが置き換えられます。
詳細は、http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
を参照してください。
この機能は、「プリファレンス」ダイアログで有効と無効を切り替えることができます。この機能はデフォルトで有効になっていることに注意してください。
この機能を無効にするには:
JDeveloperには、一般的によく使用される文のテキストを挿入することで、より迅速かつ効率的なコードの記述に役立つ事前定義コード・テンプレートが用意されています。たとえば、Iterate over a list (itli
)テンプレートでは、次のコードが挿入されます。
for (Object object : Object) { ; }
注意:
テンプレートに変数が含まれている場合、変数はハイライト表示されています。各変数を編集して、テンプレートを完成できます。[Tab]を押すと、カレットが次のテンプレート変数に移動します。
ショートカットを使用すると、必要なテンプレートを迅速に選択できます。ソース・ファイル内の任意の位置で[Ctrl]キーを押しながら[Enter]キーを押すと、選択可能なコード・テンプレートのリストが表示されます。このリストに表示されるテンプレートはコンテキストに応じて決定され、現在の位置に適したテンプレートのみが表示されます。このリストの右下端にある「QuickDoc」をクリックして、選択したコード・テンプレートの構造を表示できます。たとえば、for
ループに既存のテンプレートを使用した場合は、for
を入力し、(デフォルト・キーマップの場合)[Ctrl]を押しながら[Enter]を押します。
JDeveloperで提供されるテンプレート以外に、独自のコード・テンプレートを定義することもできます。「プリファレンス」ダイアログの「コード・エディタ」→「コード・テンプレート」ページを使用します。詳細は、「ソース・エディタのコード・テンプレートをカスタマイズする方法」を参照してください。
定義済のコード・テンプレートを起動するには、次のようにします。
注意:
[Ctrl]+[Enter]は、デフォルトのキーマップで割り当てられているアクセラレータです。別のキーを割り当てることもできます。
JDeveloperに用意されている事前定義コード・テンプレートは次のとおりです。
Array Iterator
ai for (int $i$ = 0; $i$ < $array$.length; $i$++) { $type$ $var$ = $array$[$i$]; $end$ }
データ・アクションのイベント・ハンドラ
daev public void on$end$(PageLifecycleContext ctx) { }
forループ
for for ($end$ ; ; ) { }
if文
if if ($end$) { }
if else文
ife if ($end$) { } else { }
整数に基づいたループ
fori for (int $i$ = 0; $i$ < $lim$; $i$++) { $end$ }
整数に基づいたループ
forn int $n$ = $lim$; for (int $i$ = 0; $i$ < $n$; $i$++) { $end$ }
instanceof + cast
iofc if ($var$ instanceof $type$) { $type$ $casted$ = ($type$) $var$; $end$ }
BC4Jアプリケーション・モジュールのインスタンス化
String amDef = "test.TestModule"; String config = "TestModuleLocal"; ApplicationModule am = Configuration.createRootApplicationModule(amDef,config); ViewObject vo = am.findViewObject("TestView"); $end$// Work with your appmodule and view object here Configuration.releaseRootApplicationModule(am,true);
Iterate over array
itar for (int $i$ = 0; $i$ < $array$.length; $i$++) { $type$ $var$ = $array$[$i$]; $end$ }
コレクションの繰返し
itco for(Iterator $iter$ = $col$.iterator();$iter$.hasNext();) { $type$ $var$ = ($type$) $iter$.next(); $end$ }
リストの繰返し
itli for (int $i$ = 0; $i$ < $list$.size(); $i$++) { $type$ $var$ = ($type$) $list$.get($i$); $end$ }
マップ・キーの繰返し
itmk Iterator $iter$ = $map$.keySet().iterator(); while ($iter$.hasNext()) { $type$ $var$ = ($type$) $iter$.next(); $end$ }
マップ値の繰返し
itmv Iterator $iter$ = $map$.values().iterator(); while ($iter$.hasNext()) { $type$ $var$ = ($type$) $iter$.next(); $end$ }
JDBC接続
conn public static Connection getConnection() throws SQLException { String username = "$end$scott"; String password = "tiger"; String thinConn = "jdbc:oracle:thin:@localhost:1521:ORCL"; Driver d = new OracleDriver(); Connection conn = DriverManager.getConnection(thinConn,username,password); conn.setAutoCommit(false); return conn; }
List to配列
ltoar $type$ $var$ = new $typeelem$[$list$.size()]; $var$ = ($type$) $list$.toArray($var$); $end$
mainメソッド
main public static void main(String[] args) { $end$ }
out.println()
outp out.println($end$);
private ArrayList
pral private ArrayList _$end$ = new ArrayList();
private boolean
prb private boolean _$end$;
private HashMap
prhm private HashMap _$end$ = new HashMap();
private int
pri private int _$end$;
private String
prs private String _$end$;
public static final
pusf public static final $end$;
public static final boolean
pusfb public static final boolean $end$;
public static final int
pusfi public static final int $end$;
public static final String
pusfs public static final String $end$;
反対方向の配列イテレータ
ritar for (int $i$ = $array$.length; --$i$ >= 0 ;) { $type$ $var$ = $array$[$i$]; $end$ }
反対方向のリストの繰返し
ritli for (int $i$ = $list$.size(); --$i$ >= 0 ; ) { $type$ $var$ = ($type$) $list$.get($i$); $end$ }
System.err.println
sep System.err.println($end$);
System.out.println
sop System.out.println($end$);
switch文
sw switch ($end$) { case XXX: { } break; default; { } break; }
try文
try try { $end$ } catch (Exception ex) { ex.printStackTrace(); } finally { }
タグの挿入
tag <$tag$> $end$ </$tag$>
while文
wh while ($end$) { }
「選択の拡大」または「選択の縮小」オプションを使用すると、Java構文に基づいて、選択したコード・ブロックを連続して拡大または縮小できます。このオプションを連続して適用すると、適用するたびに、開始位置に基づいて、Javaの階層で上にある次の論理ステップが含まれるように、選択が拡大されます。このことは、ファイル全体が選択されるまで行われます。たとえば、メソッド名、修飾されたメソッド・コール、割当て、定義などです。
選択したコードを拡大するには、次の手順を実行します。
「選択の縮小」オプションを使用すると(または、[Ctrl]および[Shift]を押しながら[-]を押すと)、選択したコードは同様に連続して縮小されます。
Javaソース・エディタでは、コーディング構造を使用して簡単にJavaの文およびブロックを囲むことができます。
コーディング構造でコード・ブロックを囲むには、次のようにします。
「プリファレンス」ダイアログの「コード・テンプレート」ページで、コード構成を設定できます。コード・テンプレートを必要に応じてカスタマイズしたり、既存のテンプレートを変更できます。詳細は、「ソース・エディタのコード・テンプレートをカスタマイズする方法」を参照してください。
コード折りたたみ機能を使用して、現在Javaソース・エディタで開いているファイルの各セクションを表示および非表示にすることができます。コード折りたたみにより、判読性が改善され、選択したコード・ブロックを折りたたむことで、機能定義などの特定の領域を表示できます。
コード折りたたみを使用するには、次のようにします。
JavaScriptエディタでテキストの最初の列の左側にある「-」記号をクリックします。
これにより、選択した要素のコードが折りたたまれ、「-」記号が「+」に変化します。
[+]記号をクリックしてコードを展開し、前に閉じていたエリアの全コンテンツを表示します。
マージンの記号と記号の間を右クリックしてコンテキスト・メニューを開きます。このメニューでは、コマンドを選択して、ファイル全体にわたってコードの特定領域を開いたり、折りたたんだりすることができます。
次に示すようなコードがメソッドの中にある場合、コードの中央のチャンクを縮小して、メソッドの別の部分を使用している間は中央のチャンクを見ないで済むように設定できます。
public void main(String[] args) throws SQLException, IOException { //... some code ... { Run.dbgPrnt("Extractor main() querying => BSN"); // make the basin file query = "select * from BSN"; rset = OracleAccess.makeResultSet(query, stmt); rset.next(); l = Basin.extract(rset, Version); Format.writeFile(outPath, "groupings.txt", l); } // ... some more code ... Run.dbgPrnt("Extractor main() has ended"); }
内部コード・ブロック(for、while、switch、{...}など)のコードを折りたたむことができます。
Javaソース・エディタでの作業中に、必要なimport文を追加できます。ソース・エディタでの入力中に、まだインポートされていないクラスへの参照を導入すると、そのクラスの下に波線が表示されます。インポートが必要であることを示すポップアップが開き、クラスの完全修飾名が表示されます。
図8-5 必要なimport文
クラスへの未解決の参照の完全一致を1つのみ検出できた場合は、JDeveloperによってインポートが自動的に追加されます。インポート・アシスタンスによって一致の可能性が複数検出された場合は、クラス・パスからすべての一致の可能性がポップアップ・リストに表示されます。その場合は、適切なインポートを選択すると、そのimport文が自動的に追加されます。
Import Assistanceのポップアップは、[Alt]を押しながら[Enter]を押すことで、いつでもトリガーできます。
左余白をベースとするコード・アシスタンスを使用して、import文を追加できます。エディタによってクラスが認識されない場合は、行がハイライト表示されたときに電球が左余白に表示され、様々なインポート・オプションが表示されます。
Import Assistanceを構成するか無効にするには、Javaソース・エディタでimport文オプションを設定できます。
Javaソース・エディタでは、簡単にimport文を編成できます。「設定」ダイアログで、インポートを編成するためのオプションを設定します。次のオプションがあります。
パッケージ名およびクラス名でアルファベット順にimport文をソートおよびグループ化します。
パッケージ用のtype-import-on-demand文を個々のクラス用のsingle-type-import文に置き換えて、インポートを縮小します。
ある共通パッケージのクラスの2つ以上のsingle-type-import文をそのパッケージの1つのtype-import-on-demand文に置き換えて、インポートを拡大します。
参照されないクラスに対するimport文を削除します。
インポート編成オプションを設定または無効にできます。
ソース・ファイルでimport文を編成するには、次のようにします。
エディタでファイルを開いた状態で、右クリックして「インポートの編成」を選択します。
ojformatはコマンド行ツールであり、ワークスペースまたはプロジェクトの再フォーマット化に使用できます。これは、<JDeveloper_Home>/jdev/bin
に置かれています。
ojformatの構文は次のとおりです。
ojformat option file
ここで
optionは、-ade
などのオプションです。-ade
は、バージョン・コントロール用にADE拡張機能をロードする必要があることを示しています。その他のバージョン・コントロールは自動的に機能します。
例
ojformat -ade application.jws
application.jwsにあるすべてのプロジェクトを再フォーマット化します。バージョン・コントロールはADEです。
ojformat application1.jws application2.jws
両方のアプリケーションにあるプロジェクトをすべて再フォーマット化します。
ojformat application.jws project1.jpr
application.jwsのproject1.jpr
を再フォーマット化します。
ojformat app1.jws project1.jpr app2.jws project2.jpr
app1のproject1とapp2のproject2を再フォーマット化します。
図8-6に示すように、Javaビジュアル・エディタには、ユーザー・インタフェースのビジュアル・コンポーネントが「設計」タブに表示されます。
図8-6 Javaビジュアル・エディタの「設計」ビュー
ビジュアル・クラスのJavaソース・ビューを表示するには、図8-7に示すように「ソース」タブをクリックします。
図8-7 Javaビジュアル・エディタの「ソース」ビュー
Javaビジュアル・エディタが開いている場合、図8-8に示すように、その対応する要素が「構造」ウィンドウに階層表示されます。
図8-8 Javaファイルの「構造」ウィンドウ
「プロパティ」ウィンドウが開いている場合、「構造」ウィンドウまたはJavaビジュアル・エディタで要素を選択すると、「プロパティ」ウィンドウの選択内容も変更されます。
Javaビジュアル・エディタ内の任意の場所を右クリックすると、コマンドのポップアップ・メニューが表示されます。ポップアップ・メニューは、メニュー以外の項目またはメニュー項目のどちらを編集しているかによって異なります。また、ポップアップ・メニュー内で使用できるコマンドは、選択したオブジェクトによって異なります。
Javaビジュアル・エディタを開くには:
「アプリケーション」ウィンドウでJavaファイルをダブルクリックし、エディタ・ウィンドウで「設計」タブをクリックします。
ソース・コードがソース・エディタ内でアクセス可能になります(「ソース」タブをクリックしてソース・コードを表示)。これにより、UI設計と並行してソース・コードを表示および編集できます。Javaビジュアル・エディタまたは「プロパティ」ウィンドウで行った変更は即時にソース・コードに反映されます。
Javaビジュアル・エディタのツールバーを使用すると、容易にコンポーネントを操作し、選択したコンポーネントについて表示されるポップアップ・メニューから選択できるコマンドを複製できます。
Javaビジュアル・エディタの使用の詳細は、「Java Swingユーザー・インタフェースの実装」を参照してください。
JDeveloperには、変更中のコードに対する書込み保護機能があります。この書込み保護では、動作する必要のあるコードが保持されます。図8-9に示すSwing/AWTコードのセクションはグレーで表示されていて、このコード・セクションが保護されていることを示します。
図8-9 保護されているコード
JDeveloperの編集コマンドを使用すると、図8-10に示すようなJavadocコメントを作成および保持できます。Javadocコメントの入力後に、「ファイル内検索」ダイアログを使用してそれらのコメントを検索できます。
図8-10 Javadocコメント
ソース・ファイルにドキュメント・コメントを追加するには、次のようにします。
コメントを追加するクラス宣言、フィールドまたはメソッドのすぐ上にカーソルを置き、ドキュメント・コメントの開始(/**
)を入力してから[Enter]を押します。または、
「構造」ウィンドウでコード要素を選択した状態で、メイン・メニューから「ソース」を選択し、「Javadocコメントの追加」を選択します。
ドキュメント・コメント用のテンプレートがファイルに挿入されます。このテンプレートにコード要素の情報を追加してください。
Javaソース・エディタでは、ドキュメント・コメントを更新できます。ドキュメント・コメントに対するタグが追加または削除されて、要素に加えた変更が反映されます。新しいタグに関する説明を追加します。
ソース・ファイルのドキュメント・コメントを更新するには、次のようにします。
作成するすべてのプロジェクトは、JDeveloperプロジェクトのデフォルト設定か、またはワークスペース共通ですべてのプロジェクトに対してユーザーが指定した設定になります。これらのデフォルト設定は、プロジェクトごとに置き換えることもできます。これらのプロパティの設定方法はどちらの場合でも同じであり、情報の場所および適用対象のみが異なります。
個々のプロジェクトのJavadocプロパティを設定するには、次のようにします。
Javaコード・エディタでは、ドキュメント・コメント・タグの使用をカスタマイズできます。カスタム・タグを定義したり、ドキュメント・コメントの作成時にどのタグを自動的に含めるかを選択できます。ここで選択した内容は、すべてのプロジェクトに適用されます。
カスタム・タグを作成する場合、タグをコード要素に関連付けて、必須かどうかを定義し、デフォルト値を割り当てて、タグ・リストでの順序を指定できます。
カスタム・タグを定義するには、次のようにします。
Javaソース・エディタでの作業中、クイックJavadoc機能を使用すると、コード要素(クラス、インタフェースまたは個々のメンバー)のJavadoc生成ドキュメントに簡単にアクセスできます。
図8-11に示すように、クイックJavadoc機能は、選択したエンティティをソースパスで参照し、入力されたJavadocコメントをポップアップ・ウィンドウに表示します。
図8-11 「クイックJavadoc」ウィンドウ
コード要素に対してJavadocコメントが存在しない場合には、空のJavadocコメントが表示されます。
クイックJavadoc機能は、選択したソース・コードが次の条件を満たしている場合に使用できます。次のとおりです。
このプロジェクトのソースパスに存在する。
現在のプロジェクトが依存しているプロジェクトのソースパスに存在する。
このプロジェクトに割り当てられたライブラリに使用できる。
使用中のJDKに組み込まれている。
コード要素のJavadocを表示するには、次のようにします。
単一のソース要素のJavadocを表示するときと同じ方法で、ソース・ファイルのドキュメント・コメントをプレビューできます。
特定のクラス、メンバーまたはメソッド・コールのドキュメント・コメントを表示するには、次のようにします。
ソース・ファイルに記載されているドキュメント・コメントを検証できます。監査を実施すると、書式設定エラー、欠落しているタグまたは余分なタグが報告されます。
ソース・ファイルのドキュメント・コメントをチェックするには、次のようにします。
「設定」ダイアログのJavadocページでプロジェクトに対して設定したプロパティに基づいて、APIリファレンスおよびその他のドキュメントを「アプリケーション」ウィンドウから直接生成できます。ドキュメントは、ファイルのコードおよびドキュメント・コメントからjavadocユーティリティを使用して生成されます。
パッケージ、ファイルまたはプロジェクトに対してJavadocをビルドする手順は次のとおりです。
Javaソース・コード・エディタで未解決のJava注釈に対する監査のヒントを表示する際に、欠落している注釈要素の参照を登録できます。
欠落している注釈の参照を作成する手順は次のとおりです。
Javaオブジェクト・ツリー(JOT)構造ウィンドウには、Javaソース・エディタで選択したソース要素の階層ツリーが表示されます。たとえば、次のようなコードがJavaファイルに含まれていることがあります。
public class Class1 implements Serializable{ @SuppressWarnings("serial:-4347721670334465144") // test private static final long serialVersionUID = -4347721670334465104; public Class2() { super(); } /* Non-javadoc comment */ public void a(){} // @SuppressWarnings("serial:23") private class foo{} }
これに基づき、図8-12に示すように、JDeveloperの下部にJOT構造ウィンドウが表示されます。階層には、コードの子ソース要素および親ソース要素がすべて含まれます。クラス、コード・ブロック、またはその他の要素などです。
図8-12 JOT構造ウィンドウ
Javaソース・エディタでSourceElementを選択すると、対応するSourceElementが、対応するテキストとともにJOT構造ウィンドウで強調表示されます。
Javaオブジェクト・ツリー構造はJDeveloperの拡張機能であり、この機能にアクセスするにはインストールしておく必要があります。「ヘルプ」→「更新のチェック」に移動して、この拡張機能をインストールします。
インストール後、「ウィンドウ」→JOT構造ペインを選択すると、JOT構造ウィンドウが表示されます。
Java構造ウィンドウでは、Javaコード内のJavaコメントと非Javaコメント、および空白行を表示できます。たとえば、コメントおよび空白行を表示を選択して、Javaコード内の空白行にカーソルを合わせると、その空白行が対応するテキスト(例: SourceLexicalBlankline (SRC_LEX_BLANKLINE)
)とともにツリーに表示されます。
コメントおよび空白行を表示する手順は次のとおりです。
「カーソル更新時にリフレッシュ」チェック・ボックスを使用して、階層ツリーのリフレッシュをオンまたはオフにすることができます。
たとえば、このチェック・ボリュームを選択した状態で、Javaソース・ファイル内のテキストにカーソルを合わせるとします。そのテキストのSourceElementとその親がJOTツリーに表示されます。JOT構造ウィンドウの状態を固定して、このSourceElementを使用するコードを開発するには、「カーソル更新時にリフレッシュ」チェック・ボックスの選択を解除します。変更するJavaソース・ファイルをロードします。作業中に、JOTツリーの固定した状態を参照できます。
リフレッシュ・モードを設定する手順は次のとおりです。
リファクタとは、プログラムの動作を変更することなくコード構造を変更する編集上の技術です。リファクタ操作は一連の簡単な編集で、プログラムのコードを最終的に動作変更を伴わずに変換します。各リファクタ操作の後、プログラムは正常にコンパイルおよび実行されます。JDeveloperには、自動リファクタ操作のコレクションが用意されています。
リファクタは、プログラムのソース・コードを変更して保持、拡張または再利用しやすくする際に使用します。この変更は一連のリファクタ・ステップとして行われます。ユーザーは、ステップの終了ごとに、プログラムを再ビルドおよび再検証して、エラーが発生していないか確認できます。
表8-1に、簡単なリファクタ操作の例をいくつか示します。
表8-1 リファクタ操作
操作 | 説明 |
---|---|
メソッドの名前の変更 |
この操作では、ターゲット・メソッドの使用方法を検索してから、名前の各オカレンスを置き換えるかどうかを選択できます。 |
クラスの複製 |
クラスの定義が複製され、複製された定義に含まれるクラス名のオカレンスがすべて新しい名前で置き換えられます。 |
メソッドへのパラメータの導入。 |
メソッド定義がパラメータの追加によって変更され、各メソッド・コールが変更されて、該当するタイプおよび値の引数が提供されます。 |
スキーマのターゲット・ネームスペースの変更。 |
参照するスキーマはすべて更新され、新しいターゲット・ネームスペースが割り当てられます。 |
また、JDeveloperには、次のようなさらに高度なリファクタ操作も用意されています。
選択クラス・メンバーからメンバー宣言を導出することによって、クラスからインタフェースを抽出します。
メンバー定義をクラス間で移動することによって、クラス・メンバーをスーパークラスにプル・アップまたはサブクラスにプッシュ・ダウンします。
クラスを抽出し、一連のフィールドまたはメソッドを新しいコンテナ・オブジェクトで置き換えます。
選択式で構成された新規要素への参照で選択した式を置き換えることによってフィールド、変数、パラメータまたは定数を導入します。
文で構成された新規メソッドへのコールで、強調表示された連続する文を置き換えることによって、メソッドを抽出します。
メソッド・オブジェクトを抽出して既存のコード・ブロックから新規のメソッドを作成し(「メソッドの抽出」と類似)、ただしそれを新規作成した内部クラス内に移動して、すべてのローカル変数をクラスのフィールドに変換します。
パラメータ・オブジェクトを導入し、一連のフィールドまたはメソッドを新しいコンテナ・オブジェクトで置き換えます。
リファクタ操作の結果が目的と異なる場合は、編集操作で行うように、[Ctrl]を押しながら[Z]キーを押してリファクタ操作を元に戻すことができます。
ダイアグラムでインプレース編集機能を使用してクラスの名前を変更またはクラスを移動すると、そのクラスのソース・コードが自動的にリファクタされます。ダイアグラムでJavaパッケージの名前を変更またはパッケージを移動すると、そのパッケージの内容が自動的にリファクタされます。
ダイアグラムでフィールド、メソッドまたは内部クラスを削除すると、自動的に「安全に削除」リファクタ・パターンが適用されます。詳細は、「コード要素の削除方法」を参照してください。
ダイアグラムのJavaクラス、インタフェース、列挙またはメンバーにリファクタ・パターンを適用するには、ダイアグラムで対象となるクラスまたはメンバーを選択し、「リファクタ」メニューから目的のリファクタ・パターンを選択します。このようにしてリファクタ・パターンを適用した場合、リファクタの結果をプレビューする機能を含む適切なダイアログが表示されます。詳細は、「クラスおよびインタフェースのリファクタ」を参照してください。
Javaクラス図のJavaクラス、インタフェースおよび列挙では、次のリファクタ・パターンを使用できます。
名前の変更
移動(ダイアグラムで1つ選択した場合にも複数選択した場合にも適用されます)
複製
インタフェースの抽出
スーパークラスの抽出
Javaクラス図のJavaフィールドおよびメソッドでは、次のリファクタ・パターンを使用できます。
名前の変更
移動
staticにする
メンバーのプル・アップ
メンバーのプッシュ・ダウン
メソッドの変更(Javaメソッドのみ)
JDeveloperでは、コードの質を向上できる自動リファクタ操作を幅広く提供しています。コードの外部動作は変わりませんが、内部構造が改善されます。
リファクタ操作を開始するには、次のようにします。
ツールバーから「リファクタ」を選択し、ドロップダウン・リストからリファクタ操作を選択することもできます。
図8-13に示すように、リファクタのコンテキスト・メニューでは、JDeveloperのどこを右クリックしてメニューを表示しているかによって、表示される項目が異なります。
図8-13 ドロップダウン・リストのリファクタ
たとえば、次のものを右クリックしたときに異なるリファクタ操作が表示される異なるポップアップ・メニューを表示できます。
構造メニュー
メソッドの行頭
IDEにおけるメソッドの戻り型
IDEにおけるメソッドの名前
IDEにおけるメソッドのパラメータ・リストのパラメータ
リファクタ操作の結果が目的と異なる場合は、編集操作で行うように、[Ctrl]を押しながら[Z]キーを押してリファクタ操作を元に戻すことができます。
多くの使用方法を変更する可能性があるリファクタ操作を実行する場合、手動での変更が必要な使用方法や除外が必要な使用方法を識別する場合には、使用方法のプレビューが役に立ちます。選択したリファクタ操作に応じて、「リファクタ」ダイアログの「プレビュー」ボタンをクリックすると、生じる変更のプレビューを表示できます。「プレビュー」をクリックすると、ソース・エディタの下にログ・ウィンドウが表示されます。「プレビュー」ログ・ウィンドウに表示される使用方法を確認して、それらの使用方法をインスペクトして解決し、必要に応じて操作をコミットすることができます。
ログには、閉じることが可能なパッケージとJavaファイルのツリーが表示されます。各ファイルの下には、使用方法を含むコード行が表示されます。
「編集」ウィンドウに使用方法を表示するには、ログのエントリをダブルクリックします。
リファクタ操作から使用方法を除外するには、使用方法を右クリックして「対象外」を選択します。
リファクタ操作をコミットするには、次のようにします。
Javaアプリケーションを開発する際に、パッケージ、クラス、インタフェース、メソッド、フィールド、パラメータまたは変数へのすべての参照および定義の名前を簡単に変更できます。必要に応じて、最初にプレビュー(置換する使用方法のリスト)を生成できます。使用方法をツリー形式で表示するには、「使用方法の表示」ボタンを使用します。
名前の変更操作の有効範囲は、プロジェクト内の要素の全範囲になります。プロジェクト、クラス、インタフェースおよびメンバーの各使用方法は、プロジェクト内で表示されるすべての場所で置換されます。パラメータおよび変数の名前は、定義の字句範囲でのみ変更されます。同じ名前を持つその他の要素は変更されません。
デフォルトでは、操作は、コメント(ただし、コード要素を指定するドキュメント・コメント・タグではない)および注釈を除いた、.java
ファイルに制限されます。あいまいではない使用方法が置換されます。クラスとインタフェースの使用方法の名前は、完全修飾されている場合、またはimport文で指定されている場合に置換されます。
パッケージ、型およびメンバー要素の場合、操作はコメントまたはその他のファイルにまで拡張できます。操作をコメントにまで拡張する場合は、行コメント、コメント・アウトされたコード、ドキュメント・コメントの本体および注釈で置換が行われます。操作をその他のファイルにまで拡張する場合、「プリファレンス」ダイアログの「ファイル・タイプ」ページでテキスト・ファイルとして指定されているタイプのプロジェクト・ファイルでもテキスト置換が行われます。コメントおよびその他のファイルでの置換は、Javaコードでの置換よりもアグレッシブに行われます。
コード要素の名前を変更するには、次のようにします。
Javaアプリケーションを開発する際に、クラス、インタフェース、メソッドまたはフィールドの定義を安全に削除できます。要素が使用中の場合は、ユーザーの確認なしに定義の削除が実行されることはありません。
要素が使用中である場合は、使用方法を示すログが表示されます。このリストを使用して、使用方法をインスペクトおよび解決します。このため、削除を確認しても、残りの使用方法は未定義の参照としてコード内に残ります。
コード要素を削除するには、次のようにします。
Javaアプリケーションを開発する際に、新規クラスとインタフェースの定義、および既存のクラスの再利用が簡単に実行できます。たとえば、パッケージ、クラスまたはインタフェースを別のパッケージに移動することができます。オプションで、最初にプレビュー(置換する使用方法のリスト)を生成できます。プレビューを使用して、移動を完了する前に、選択した使用方法を調査、変更するかまたは除外します。
タイプを移動する場合、プライマリ・クラスおよびプライマリ・インタフェース(ファイルと同じ名前を持つもの)のみが移動対象として選択できます。実際には、ファイルの名前が変更され、セカンダリ・クラスおよびセカンダリ・インタフェースの定義はプライマリとともに残ります。アクセス・レベルは保持されます。元のパッケージの他のクラスが移動対象のクラスを参照している場合、移動対象のクラスにはpublicアクセス権が付与されます。移動対象のクラスが元のパッケージの他のクラスを参照している場合は、元のパッケージの他のクラスがpublicになります。
クラスまたはインタフェースを移動する操作の範囲は、プロジェクト全体です。
デフォルトでは、操作は、コメント(ただし、コード要素を指定するドキュメント・コメント・タグではない)および注釈を除いた、.java
ファイルに制限されます。あいまいではない使用方法が置換されます。完全修飾されている場合、またはimport文に指定されている場合は、使用方法が置換されます。
操作をコメントまたはその他のファイルにまで拡張することを選択できます。操作をコメントにまで拡張する場合は、行コメント、コメント・アウトされたコード、ドキュメント・コメントの本体、および注釈に含まれるテキストが置換されます。操作をその他のファイルにまで拡張する場合は、「設定」ダイアログの「ファイル・タイプ」ページでテキスト・ファイルとして指定されるタイプのプロジェクト・ファイルに対しても置換が行われます。コメントおよびその他のファイルでの置換は、Javaコードでの置換よりもアグレッシブに行われます。
クラスまたはインタフェースを移動するには、次のようにします。
クラスは、「アプリケーション」ウィンドウで複数のクラスを1つのパッケージから別のパッケージにドラッグして移動することもできます。
Javaアプリケーションを開発する際に、クラスまたはインタフェースを簡単に複製できます。
プライマリ・クラスおよびプライマリ・インタフェース(ファイルと同じ名前を持つもの)のみが複製対象として選択できます。複製されたクラスまたはインタフェースは、同じパッケージにオリジナルとして追加されます。
新しいクラスのメンバー名には、オリジナルでのメンバー名と同じ名前が付けられます。ただし、オリジナル・クラスやオリジナル・インタフェースの名前から導出されたメンバー名は除きます。オリジナル名がメンバー名に埋め込まれている場合は、新しい名前に置換されます。
クラスまたはインタフェースを複製するには、次のようにします。
Javaアプリケーションを開発する際に、既存のクラスに定義されている選択したメソッドおよびstaticフィールドから新しいインタフェースを簡単に導出できます。
オプションとして、パラメータ、変数およびメンバーのタイプ仕様などの宣言を、宣言に含まれるタイプ名を新規インタフェース名で置き換えることによって、宣言を汎化することもできます。ただし、すべての宣言を置換できるわけではありません。たとえば、メソッドの起動に使用される変数の宣言は、このメソッドが新規インタフェースに抽出されていない場合は、置換できません。置換はプロジェクト内のすべての場所で行われます。
クラスの宣言が変更され、新しいインタフェースが実装されたことが示されます。
インタフェースを抽出するには、次のようにします。
スーパークラスを抽出すると、コードの作成後であっても追加レベルを階層に追加することができます。スーパークラスは、選択したクラスの選別メンバーに基づいて作成できます。スーパークラスは、選別メンバーに一致するフィールド宣言とメソッド宣言で構成されます。
スーパークラスを抽出するには、次のようにします。
Javaアプリケーションを開発する際に、選択したクラスの参照をスーパータイプの1つへの参照で置き換えることによって、パラメータ、変数およびメンバーのタイプ仕様などの宣言を簡単に汎化できます。ただし、すべての宣言を置換できるわけではありません。たとえば、メソッドの起動に使用される変数の宣言に対する置換は、このメソッドもスーパータイプに定義されていない場合は行われません。置換はプロジェクト内のすべての場所で行われます。
宣言を汎化するには、次のようにします。
メソッドの本体内でインナー・クラスを宣言できます。また、メソッドの本体内で、名前を付けずにインナー・クラスを宣言することもできます。これを匿名内部クラスといいます。JDeveloperでは、無名の内部クラス(匿名クラス)を名前付き内部クラスに変換できます。
匿名クラスを内部クラスに変換するには、次のようにします。
最上位レベルに新しく作成したクラスに内部クラスを移動できます。クラスが不適切なパッケージにあるため、より適合する別のパッケージに移動する必要がある場合などにこの操作が使用できます。
内部クラスを移動するには、次のようにします。
Javaアプリケーションを開発する際に、メンバー定義をクラス間で簡単に移動できます。たとえば、クラス・メンバー(メソッドなど)を別のクラスに移動できます。
static
キーワードを使用して修飾子として宣言されたメソッドをstaticメソッドまたはclassメソッドといいます。
staticメソッドでは、それが定義されているクラスのインスタンス変数は使用されません。main
メソッドのメソッド・シグネチャはstaticであり、main
メソッドを呼び出すためにクラスのインスタンスを作成する必要がないことを示しています。メソッドをstaticに定義した場合、インスタンス変数にアクセスしようとすると、コンパイラがエラー・メッセージを表示します。
staticメソッドを移動するには、次の手順を実行します。
メソッドに static
修飾子を割り当てることができます。要素をstaticにする際に、staticではないコンテキストでの使用方法が見つかった場合のアクションを指定することもできます。
メソッドをstaticメソッドに変更するには、次のようにします。
メソッドのシグネチャを変更できます。メソッドのシグネチャは、メソッドの名前とパラメータの番号およびタイプ(およびそれらの順序)の組合せです。
メソッドのシグネチャを変更するには、次のようにします。
注意:
この機能はコンストラクタには適用されません。
Javaアプリケーションを開発する際に、メンバーの定義をクラス(ソース・クラス)からそのスーパークラスの1つ(ターゲット・クラス)に簡単に移動できます。プロジェクト内にこのクラスの潜在的なターゲット・クラスが1つ以上存在する場合にのみ、この操作をクラスに適用できます。メンバーをライブラリ・クラスにプル・アップすることはできません。同様に、このリファクタ・コマンドは、スーパークラス句または実装されているインタフェースの一覧で宣言されているクラスにのみ適用されます。
デフォルトでは、メソッドをプル・アップすると、その定義はソース・クラスからターゲット・クラスに移動されます。メソッドを抽象化するように選択することもできます。この場合、メソッド定義はソース・クラスに残り、メソッドの宣言がターゲット・クラスに追加されます。メソッドを抽象化すると、ターゲット・クラスが未変換の場合は、ターゲット・クラスが抽象クラスに変換されます。
プル・アップ対象のメンバーには依存性がある場合があります。依存性がプル・アップ対象のメンバーの定義で使用されている場合、メンバーに依存性があります。依存性をプル・アップしないでメンバーをプル・アップすると、ターゲット・クラスに未定義の参照が発生します。プル・アップするメンバーを選択すると、そのメンバーの依存性が示されます。この場合、依存性もプル・アップするかどうかを選択できます。
privateとして宣言されたメンバーをプル・アップする場合、アクセスはprotectedに変更されます。
メンバーをプル・アップするには、次のようにします。
Javaアプリケーションを開発する際に、メンバーの定義をクラス(ソース・クラス)から直下のサブクラス(ターゲット・クラス)に簡単に移動できます。
デフォルトでは、メソッドをプッシュ・ダウンすると、メソッドの定義はソース・クラスからターゲット・クラスに移動します。メソッドの宣言をソース・クラスに残し、ソース・クラスが未変換の場合は、ソース・クラスを抽象クラスに変換するように選択することもできます。
プッシュ・ダウン対象のメンバーには依存性がある場合があります。メンバーがプッシュ・ダウン対象のメンバーの定義を使用している場合、このメンバーには依存性があります。依存性をプッシュ・ダウンしないでメンバーをプッシュ・ダウンすると、ソース・クラスに未定義の参照が発生します。プッシュ・ダウンするメンバーを選択すると、その依存性が示されます。この場合、依存性もプッシュ・ダウンするかどうかを選択できます。
メンバーをプッシュ・ダウンするには、次のようにします。
Javaアプリケーションを開発する際に、式を名前付き要素に簡単に変換できます。たとえば、式をフィールドの参照に変換できます。新しいフィールド宣言がクラスに追加され、選択した式によって初期化されます。元の式は、新しいフィールドの参照と置き換えられます。
式のタイプがvoid
である場合、式をフィールドに変換することはできません。
フィールドを導入するには、次のようにします。
メソッド本体をコール元の本体に取り込み、元のメソッドを削除できます。これは、メソッド・コールのインライン化と呼ばれます。
メソッド・コールをインライン化するには、次のようにします。
Javaアプリケーションを開発する際に、式を変数の参照に簡単に変換できます。新しい変数宣言がメソッドに追加され、選択した式によって初期化されます。元の式は新しいメンバーの参照と置き換えられます。
式のタイプがvoid
である場合、この式をメンバーに変換することはできません。
メンバーを導入するには、次のようにします。
Javaアプリケーションを開発する際に、メソッド本体の定数式をメソッドの新しいパラメータに簡単に変換できます。式は新しいパラメータの名前に置き換えられ、新しいパラメータがメソッドのパラメータ・リストに追加されます。また、すべてのメソッドの起動で、この式は追加引数として挿入されます。
リテラルまたはリテラルの操作が存在する場合にのみ、式をパラメータとして導入できます。
この操作は、インタフェースを実装するメソッドに対しては禁止されています。このようなメソッドのシグネチャを変更すると、実装が無効化されます。
パラメータを導入するには、次のようにします。
Javaアプリケーションを開発する際に、定数式を定数参照に簡単に変換できます。定数式によって初期化された新しい定数宣言がクラスに追加され、元の定数式は定数の名前によって置き換えられます。
リテラルまたはリテラルの操作が存在する場合にのみ、式を定数として導入できます。
定数を導入するには、次のようにします。
Javaアプリケーションを開発する際に、メソッドの本体の一部を抽出して別のメソッドを簡単に作成できます。抽出したコードは、元のメソッドで新しいメソッドへのコールに置き換えられます。抽出したコードで使用されていたローカル変数およびパラメータは、新しいメソッドのパラメータになります。抽出したコードの文によって行われる割当てが存在する場合は、元のメンバーで新しいメソッドへのコール値を使用する割当てに変換されます。
抽出を行うには、コードが次の制限を満たす必要があります。
単一の完全な式または一連の完全な文で構成されていること。
選択したコードの外部に宣言がある、複数の変数に割り当てることができないこと。
複数の終了ポイントを使用できないこと。終了ポイントとは、選択したコードで捕捉されない例外をスローする文、選択したコードの外部のループのbreak
またはcontinue
文、またはreturn
文です。
新しいメソッドは、元のメソッドと同じクラスに追加されます。新しいメソッドは、private
として宣言されます。
注意:
選択したコード・ブロックのみが、抽出されたメソッドによって置換されます。その他の同じコード・ブロックは置換されません。
メソッドを抽出するには、次のようにします。
クラスのフィールドとメソッドを置き換えるには、新しいクラスを抽出します。フィールドへのすべての参照は、その新しいクラスにアクセスするように更新されます。クラスを抽出すると、複雑になりすぎたクラスを管理できます。
クラスを抽出するには:
コンストラクタをファクトリ・メソッドに変換できます。コンストラクタによって、クラスのインスタンスが作成されます。ファクトリ・メソッドは、ネイティブ・クラスのインスタンスを返すstaticメソッドです。ファクトリ・メソッドは、コンストラクタが非常に制約的な状況で使用できます。
コンストラクタをファクトリ・メソッドに変換するには、次のようにします。
カプセル化によってクラス内のフィールドがprivateになり、publicメソッド経由でフィールドにアクセスできるようになります。フィールドがprivateと宣言された場合、クラスのアウトラインからそのフィールドにアクセスすることはできません。これにより、クラス内のフィールドが非表示になります。publicアクセス可能なクラスのフィールドを、クラス内からのみアクセス可能に変更できます。
フィールドをカプセル化するには、次のようにします。
Javaアプリケーションの開発中に、ブールのフィールド、パラメータまたはローカル変数を選択し、反対の値で初期化できます。JDeveloperは自動的にすべての参照を修正し、同じコード機能を維持します。JDeveloperがすべてのフィールド、パラメータ、ローカル変数を参照し、すべての使用方法を反転します。このリファクタによって、ブールのメソッドまたは変数の意味が反転します。true
に評価されるブール式はfalse
になります。同様に、false
に評価されるブール式はtrue
になります。
たとえば、有効になっている変数があり、その意味を反転する場合には、「ブールの反転」メニューの選択によって、使用方法を無効にします。
ブールを反転するには、次のようにします。
表8-2 ブールの反転の例
前 | 後 |
---|---|
private double a;...public boolean method() { if (enabled){ a =5; return true; } false;} |
private double a;...public boolean method() { if (disabled{ a =5; return false; } return true;} |