SDK for Java バージョン 5 の機能の SQLJ での利用

SQLJ アプリケーションで、SDK for Java バージョン 5 で導入された多くの機能を使用することができます。

静的インポート

import static 構文を使用すれば、静的メンバーが属しているクラスの名前でそれらのメンバーを修飾せずに、静的メンバーにアクセスすることができます。 つまり SQLJ アプリケーションの場合、静的メンバーを修飾せずにホスト式でそれらのメンバーを使用することができます。

例: 次の形式のホスト式を宣言したいとします。
double r = cos(PI * E);
cos、PI、および E は java.lang.Math クラスのメンバーです。 cos、PI、および E を明示的に修飾しないで r を宣言するには、次の import static ステートメントをプログラム内に含めます。
import static java.lang.Math.*;

アノテーション

Javaアノテーションは、Javaプログラムにメタデータを追加する手段であり、それにより、ツールやライブラリによるプログラムの処理方法にも影響を与えることができます。 アノテーションは、インターフェース宣言と同様なアノテーション型宣言で宣言されます。 Javaアノテーションは、以下のタイプのクラスまたはインターフェースに記述することができます

  • クラス宣言
  • インターフェース宣言
  • ネスト・クラス宣言
  • ネスト・インターフェース宣言

SQLJプログラムに直接Javaアノテーションを含めることはできませんが、Javaソースコードにアノテーションを含め、そのソースコードをSQLJプログラムに含めることはできます。

例: 次のマーカー・アノテーションを MyAnnot.java というプログラム内で宣言するとします。
public @interface MyAnot { }
次のマーカー・アノテーションも MyAnnot2.java というプログラム内で宣言します。
public @interface MyAnot2 { }
これで、これらのアノテーションを SQLJ プログラム内で以下のように使用することができます。
// Class annotations
@MyAnot2 public @MyAnot class  TestAnnotation   
{
  // Field annotation
  @MyAnot
  private static final int field1 = 0;          
  // Constructor annotation
  @MyAnot2 public @MyAnot TestAnnotation  () { } 
   // Method annotation
   @MyAnot             
   public static void main (String a[]) 
   {
      TestAnnotation TestAnnotation_o = new TestAnnotation();
      TestAnnotation_o.runThis();
   }
  // Inner class annotation
  public static @MyAnot class TestAnotherInnerClass { }
  // Inner interface annotation
  public static @MyAnot interface TestAnotInnerInterface { }
}

列挙型

列挙型とは、一連の順序付けられた値で構成されるデータ型のことです。 Java バージョン 5 の SDK では、列挙型に enum 型が導入されています。

enum は以下の場所に組み込むことができます。
  • SQLJプログラムに含めるJavaソースファイル(.javaファイル)
  • SQLJ のクラス宣言内

例: TestEnum.sqlj クラス宣言に、enum 型が含まれています。
public class TestEnum2
{
  public enum Color {
	  RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET}
  Color color;
  …                          // Get the value of color
  switch (color) {
	case RED: 
    System.out.println("Red is at one end of the spectrum.");
    #sql[ctx] { INSERT INTO MYTABLE VALUES (:color) };
	  break;
	case VIOLET:
    System.out.println("Violet is on the other end of the spectrum.");
	  break;
	case ORANGE:
	case YELLOW:
	case GREEN:
  case BLUE:
  case INDIGO:
    System.out.println("Everything else is in the middle.");
	  break;
}

総称

Javaコレクションに型を割り当てるために、Javaプログラムでジェネリクスを使用することができます。 SQLJ 翻訳プログラムは、Java のジェネリクス構文を許容します。 総称は SQLJ ホスト変数内で使用できますが、総称の使用の意義は、SQLJ 変換プログラムではそれらのホスト変数の型を判別できないため限られています。

SQLJ プログラムで使用できる総称の例は以下のとおりです。
  • List オブジェクトの List:
    List <List<String>> strList2 = new ArrayList<List<String>>();
  • キーと値の組みが String 型である HashMap:
    Map <String,String> map = new HashMap<String,String>();
    
  • 任意の型のエレメントを持つ List を使用するメソッド:
    public void mthd(List <?> obj) {
    …
    }
SQLJ プログラムでの総称の無効な使用例を以下に示します。
  • メソッドの戻りの型で総称をネストする:
    public* List<Map<String, Object>> *method(String, String, String);

拡張されたされた for ループ

拡張された for を使用すれば、一連の命令をコレクションまたは配列の各メンバーに対して実行することを指定できます。 イテレーターを、拡張された for ループ内でホスト式で使用することができます。

例: 配列 names 内の項目ごとに表 TAB に対して INSERT を実行します。
String[] names = {"ABC","DEF","GHI"};
for (String n : names) 
{
  #sql {INSERT INTO TAB (VARCHARCOL) VALUES(:n) };
}

可変引数

可変引数により、任意の数の値をメソッドに受け渡すことが容易になります。 メソッド宣言の最後の引数の位置にある可変引数により、最後の引数が配列または一続きの引数であることが示されます。 SQLJ プログラムでは、受け渡されたホスト式内の引数を使用することができます。

例: 任意の数の Object 型のパラメーターを、各パラメーター値を表 TAB に挿入するメソッドに受け渡します。
public void runThis(Object...  objects) throws SQLException
{
  for (Object obj : objects) 
  {
    #sql { INSERT INTO TAB (VARCHARCOL) VALUES(:obj) };
  }
}