1. switch 条件文に文字列を追加する方法は、文字列の hashcode() 値を使用して実際の値を取得することです。
2. 数値の前に「0b」または「0B」を追加することで、リテラル、バイナリで使用できる基本システムを追加しました。
3. 値のサイズに影響を与えずに読みやすくするために、数値リテラルでアンダースコアを使用して数値を区切ります。基本的な原則は、下線はその前後に数字がある場合にのみ表示されるということです。
4.java7 では、例外に 2 つの変更が加えられています。
4.1. catch 句で同時に複数の例外をキャッチすることをサポートし、もう 1 つは例外をキャッチして再スローする際の例外の型をより正確にすることです。 Java 7 では、Throwable クラスに addSuppressed メソッドが追加されました。例外がスローされると、その例外によって他の例外が抑制される可能性があり、正常にスローできなくなります。このとき、抑制された例外は、addSuppressed メソッドを使用して記録できます。これらの例外は、getSuppressed メソッドを使用して取得することもできます。この利点は、例外が失われず、開発者がテストしやすくなることです。
Java7 では catch 句の構文が改善され、各例外タイプを「|」で区切って複数の例外を指定できるようになりました。 catch 句でキャプチャされた例外は型を繰り返すことができず、例外の 1 つを別の例外パラメータのサブクラスにすることもできないことに注意してください。そうしないとコンパイル エラーが発生します (小文字から大文字までは問題ありません)。 )。 catch 句で複数の例外が宣言されている場合、例外パラメータの特定の型は、これらすべての例外型の最小上限になります。
4.2 try (リソース アプリケーション) {業務処理} を使用してリソースを自動的に解放する try ステートメントで管理できるリソースは、1 つの条件を満たす必要があります。つまり、その Java クラスが java.lang.AutoCloseable インターフェイスを実装している必要があります。そうでない場合は、コンパイル エラーが発生します。が発生します。このインターフェイスの close メソッドは、リソースを解放する必要があるときに自動的に呼び出されます。
5. 可変長パラメータを使用してメソッド呼び出しを最適化します。
j2se5.0 で導入された新機能は、メソッド宣言で可変長パラメーターの使用を許可することです。メソッドの最後の仮パラメータは、同じ型の任意の数のパラメータを表すように指定できます。呼び出されると、これらのパラメータは配列の形式で渡されます。これらのパラメーターは、メソッド本体で配列として参照することもできます。
6. Java 7 では、新しいアノテーション @SafeVarargs が導入されています。開発者が、可変長パラメーターを使用するメソッドがジェネリック クラスで使用されたときに同様の状況を引き起こさないと確信している場合は、このアノテーションを使用してメソッドを宣言できます。 @SafeVarargs アノテーションは、可変パラメーター長を持つメソッドまたはコンストラクターでのみ使用できます。メソッドは static または Final として宣言する必要があります。そうしないと、コンパイル エラーが発生します。メソッドに @SafeVarargs アノテーションが付けられる前提として、開発者は、このメソッドの実装におけるジェネリック型パラメーターの処理によって型安全性の問題が発生しないことを確認する必要があります。
7.Java は、スクリプト エンジンを通じて Java 仮想マシンでいくつかのスクリプト言語をサポートします。実際、スクリプト エンジン マネージャーは、名前、ファイル拡張子、MIME タイプによって完成される 3 つの検索エンジン メソッドをサポートしています。のように
7.1 言語バインディング:
スクリプト言語サポート API の大きな利点は、Java 言語とスクリプト言語の間の対話を標準化することで、Java 言語で書かれたプログラムがスクリプトを使用して双方向のメソッド呼び出しとデータ転送を実行できることです。データ転送は、言語バインディング オブジェクトを通じて行われます。いわゆる言語バインディング オブジェクトは、共有する必要があるデータを保存および取得するために使用される単純なハッシュ テーブルです。すべてのデータはこのハッシュ テーブルのエントリに対応し、単純な名前と値のペアです。インターフェイス javax.script.Bingings は、java.util.Map インターフェイスを継承する言語バインディング オブジェクトのインターフェイスを定義します。スクリプト エンジンは、実行中に複数の言語バインディング オブジェクトを使用する場合があります。言語が異なれば、オブジェクトをバインドするスコープも異なります。デフォルトでは、スクリプト エンジンは、実行中に生成されるグローバル オブジェクトを格納するための複数の言語バインディング オブジェクトを提供します。 ScriptEnging クラスは、特にスクリプト エンジンで使用されるデフォルトの言語バインディング オブジェクトを操作するための put メソッドと get メソッドを提供します。プログラムは、このデフォルトの言語バインディング オブジェクトを直接使用することも、独自の言語バインディング オブジェクトを使用することもできます。スクリプトの実行中、言語バインディング オブジェクトは追加の変数マッピング テーブルとみなすことができます。言語バインディング オブジェクト内の名前も、変数値を解析するときに考慮されます。スクリプトの実行中に生成されるグローバル変数およびその他のコンテンツは、言語バインディング オブジェクトに表示されます。このようにして、Java とスクリプト言語間の双方向のデータ転送が完了します。
たとえば、「name」という名前の文字列が、ScriptEngine の put メソッドを通じてスクリプト エンジンのデフォルト言語バインディング オブジェクトに追加され、そのオブジェクトはスクリプト内で名前によって直接参照されます。同様に、スクリプト内で作成したグローバル変数「message」もScriptEngingのgetメソッドで取得できます。これにより、Java プログラムとスクリプト間の双方向のデータ転送が実現します。データ転送時の型変換はスクリプト エンジンによって行われ、変換ルールは特定の言語の文法に依存します。
ほとんどの場合、ScriptEnging の put メソッドと get メソッドを使用するだけで十分です。 put メソッドと get メソッドのみが使用される場合、言語バインディング オブジェクト自体は開発者にとって透過的です。場合によっては、プログラム独自の言語バインディング オブジェクトを使用する必要があります。たとえば、言語バインディング オブジェクトには、プログラム独自のデータが含まれています。独自の言語バインディング オブジェクトを使用する場合は、次のように、スクリプト エンジンの creatBingings メソッドを呼び出すか、javax.script.SimpleBingings オブジェクトを作成してスクリプト エンジンの eval メソッドに渡すことができます。
eval メソッドを通じて渡された言語バインディング オブジェクトは、現在の eval 呼び出しでのみ有効となり、エンジンのデフォルトの言語バインディング オブジェクトは変更されません。
7.2 スクリプト実行コンテキスト スクリプト エンジンの実行に関連するもう 1 つの重要なインターフェイスは javax.script.ScriptContext です。これには、スクリプト エンジンの実行中に関連するコンテキスト情報が含まれています。これは、JavaEE のサーブレット仕様の javax.servlet.ServletContext インターフェイスと比較できます。 。スクリプト エンジンは、コンテキスト オブジェクトを参照してスクリプトの実行に関連する情報を取得します。また、開発者はこのオブジェクトを通じてスクリプト エンジンの動作を構成できます。上位オブジェクトと下位オブジェクトには主に以下の 3 種類の情報が含まれます。
7.2.1 入出力 まず、スクリプトが実行時に入力データを読み取るために使用する java.io.Reader オブジェクトと、正しい内容を出力する java.io.Writer など、スクリプトの入出力に関連する構成情報を紹介します。エラー情報。デフォルトでは、スクリプトの入力と出力は標準コンソールで行われます。スクリプトの出力をファイルに書き込む場合は、次のコードを使用できます。 setWriter メソッドを使用して、スクリプトの出力をファイルにリダイレクトします。 ScriptContextのsetReaderメソッドとsetErrorWriterメソッドにより、スクリプト実行時のデータ入力元、エラー発生時のエラーメッセージの出力先をそれぞれ設定できます。
7.2.2 カスタムプロパティ
ScriptContext には、ServletContext と同様の属性を取得および設定するためのメソッド、つまり setAttribute と getAttribute もあります。違いは、ScriptContext の属性がスコープ化されていることです。異なるスコープの違いは、検索順序です。各スコープは、対応する整数を使用して検索順序を表します。整数値が小さいほど検索の優先順位が高くなります。優先度の高いスコープ内のプロパティは、優先度の低いスコープ内の同じ名前のプロパティを非表示にします。したがって、プロパティを設定するときにスコープを明示的に指定する必要があります。属性を取得するときは、指定したスコープで検索するか、スコープの優先順位に基づいて自動的に検索するかを選択できます。
ただし、スクリプト実行コンテキスト実装に含まれるスコープは固定です。開発者は独自のスコープを自由に定義できません。使用可能なすべてのスコープのリストは、ScriptContext の getScopes メソッドを通じて取得できます。 SciptContext には 2 つのスコープが事前定義されています。定数 ScriptContext.ENGINE_SCOPE で表されるスコープは現在のスクリプト エンジンに対応し、ScriptContext.GLOBAL_SCOPE で表されるスコープは同じエンジン ファクトリから作成されたすべてのスクリプト エンジン オブジェクトに対応します。前者の方が優先されます。例えば:
7.2.3 言語バインディングオブジェクト
スクリプト実行コンテキストの最後のタイプの情報は、言語バインディング オブジェクトです。言語バインディング オブジェクトもスコープに対応します。スコープの優先順位と同じ順序が、言語に束縛されたオブジェクトにも適用されます。この優先順位は、スクリプト実行時の変数解決に影響します。例えば:
bindings.put("名前","ワールド")
Engine.eval("println(名前);");
7.3 スクリプトのコンパイル:
スクリプト言語は通常、解釈されて実行されます。スクリプト エンジンは、実行時にスクリプトを実行する前にスクリプトを解析する必要があります。一般に、解釈を介してスクリプトを実行すると、コンパイル後に実行するよりも遅くなります。スクリプトを複数回実行する必要がある場合、スクリプトを最初にコンパイルできます。コンパイルされたスクリプトは実行時に繰り返し解析する必要がないため、実行効率が向上します。すべてのスクリプト エンジンがスクリプトのコンパイルをサポートしているわけではありません。スクリプト エンジンがこの機能をサポートしている場合、これを宣言するために javax.script.Compilable インターフェイスが実装されます。スクリプト エンジンのユーザーは、この機能を利用して、複数回実行する必要があるスクリプトの効率を向上させることができます。 Java SE に付属の JavaScript スクリプト エンジンは、スクリプトのコンパイルをサポートしています。
次のコードでは、Compilable インターフェイスのコンパイル メソッドを使用してスクリプト コードをコンパイルし、コンパイル結果は javax.script.CompiledScript で表されます。すべてのスクリプト エンジンが Compilable インターフェイスをサポートしているわけではないため、ここでは、instanceof を使用して判断する必要があります。 run メソッドでは、CompiledScript の eval メソッドを通じてスクリプトを実行できます。このコードでは、コンパイルされたスクリプトを繰り返し実行した場合のパフォーマンス上の利点を示すために、スクリプトが 100 回繰り返し実行されます。
public void run(String scriptText) throws ScriptException {
CompiledScript スクリプト = コンパイル(scriptText);
if (script == null) {
戻る;
}
for (int i = 0; i < 100; i++) {
script.eval();
}
}
7.4 スクリプトでのメソッド呼び出し スクリプトで最も一般的で実用的なのはメソッドです。一部のスクリプト エンジンでは、ユーザーがスクリプト内のメソッドを個別に呼び出すことができます。このメソッド呼び出しをサポートするスクリプト エンジンは、javax.script.Invocable インターフェイスを実装できます。 Invocable インターフェイスを介して、スクリプトのトップレベル メソッドやオブジェクトのメンバー メソッドを呼び出すことができます。スクリプトのトップレベル メソッドまたはオブジェクトのメンバー メソッドが Java のインターフェイスを実装している場合、Invocable インターフェイスのメソッドを通じて、スクリプト内の対応する Java インターフェイスの実装オブジェクトを取得できます。このようにして、インターフェイスを Java 言語で定義し、スクリプトに実装できます。インターフェイスを使用するプログラムの他の部分は、インターフェイスがスクリプトによって実装されていることを認識しません。 Compilable インターフェイスと同様、ScriptEngine の Invocable インターフェイスの実装もオプションです。
次のコードは、Invocable インターフェイスの invokeFunction を介してスクリプト内の最上位メソッドを呼び出します。呼び出し中のパラメータはスクリプト内のメソッドに渡されます。 JavaSE に付属の JavaScript スクリプト エンジンは Invocable インターフェイスを実装しているため、エンジンが Invocalbe インターフェイスを実装しているかどうかの判断はここでは省略されています。 Java でのスクリプトのトップレベル メソッドの呼び出しの例は次のとおりです。
//Javaでスクリプトオブジェクトのメンバメソッドを呼び出す例
7.5 スクリプトでの Java インターフェースの実装
一部のスクリプト エンジンでは、インターフェイスを Java 言語で定義し、インターフェイスの実装をスクリプトで記述することができます。この方法では、プログラムの他の部分は Java インターフェイスとのみ対話できるため、気にする必要はありません。インターフェースがどのように実装されているか。次のコードでは、Greet は Java で定義されたインターフェイスであり、getGreeting メソッドが含まれています。このインターフェイスをスクリプトに実装すると、getInterface メソッドを使用して、スクリプトによって実装されたインターフェイスのオブジェクトを取得し、その中のメソッドを呼び出すことができます。
スクリプト言語の構文はシンプルで柔軟であるため、プログラミングの経験がない、またはほんの少ししかないユーザーは、スクリプト言語を使用してプログラムのビジネス ロジックとユーザー インターフェイスをカスタマイズできます。言語を使用すると、プログラムの使いやすさが向上し、柔軟性と柔軟性のバランスが向上します。たとえば、スクリプト言語 Lua は、ゲームの内部動作やユーザー インターフェイスをカスタマイズするためにゲーム開発で広く使用されています。
8. リフレクション API は Java プログラムに柔軟性をもたらしますが、リフレクション API の実装メカニズムにより、追加のパフォーマンス コストも発生します。メソッドの呼び出しなど、同じ操作の場合、リフレクション API を使用して動的に実装する方が高速です。コードを記述する方法は、ソース内で直接実行するよりもおそらく 1 ~ 2 桁遅くなります。 Java 仮想マシンの実装の改善により、リフレクション API のパフォーマンスが大幅に向上しました。ただし、このパフォーマンスのギャップは客観的に存在します。そのため、比較的高いパフォーマンス要件が必要な一部のアプリケーションでは、リフレクション API を慎重に使用する必要があります。