Java の予約語を変数、メソッド、クラス、インターフェース、パッケージ、または列挙定数名として使用するトリッキーな方法はありますか?
13 に答える
これは有効な質問です。そういうことは他の言語でも可能です。C# では、識別子の前に@
(前に尋ねたように) を付けます。Delphi では、プレフィックスとして&
. しかし、Java にはそのような機能はありません (.Net の世界のように、他の言語で定義された識別子と実際に対話する必要がないためです)。
いいえ、方法はありません。そのため、「予約済み」というラベルが付けられています。
ほとんどの場合、この問題は「クラス」で発生します。この場合、「クラズ」と書くのが通例です。
いいえ、これはできません。詳細については、JLSセクション3.8、3.9を参照してください。
ASCII文字から形成された次の文字シーケンスは、キーワードとして使用するために予約されており、識別子として使用することはできません(§3.8)。
Keyword: one of abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while
厳密に言えば、Java 言語仕様に準拠していないバグのあるコンパイラ実装を手に入れない限り、それはできません。
しかし、意志あるところに道は開けます。次のコードを IDE にコピーし、ソース ファイルのエンコーディングを UTF-16 に切り替えます。
public class HelloWorld {
public static void main(String[] args) {
HelloWorld.nеw();
}
public static void nеw () {
System.out.println("Hello,World");
}
}
このコードは整形式で有効な Java クラスです。ただし、ご想像のとおり、ちょっとしたトリックがあります。"new" 識別子内の 'е' 文字は ASCII 文字セットに属しておらず、実際にはキリル文字の 'е' (発音は 'YE') です。
現在の Java 言語仕様では、識別子の命名に Unicode を使用することが明示的に許可されており、これは重要なポイントです。つまり、必要に応じて、フランス語、中国語、またはロシア語で自分のクラスを自由に呼び出すことができるということです。コード内でアルファベットを組み合わせることも可能です。そして歴史的に、ラテン文字やその他のアルファベットの一部の文字は似ています。
結果: いいえ、予約語を識別子として使用することはできませんが、予約語とまったく同じように見える識別子を使用できます。
誰かがそれをやるべきかどうかは、まったく別の問題です。
はいあります。将来の予約語を使用する必要があります。1.4より前のコードでassert()と呼ばれるさまざまなメソッドで起こったことのように。
それが役に立てば幸い!
何をしようとしているのかわかりませんが、$ は識別子の有効な文字であるため、次のように言えます。
int $return = 5;
少し奇妙に見えますが、機能します。
Scala では、バックティックを使用できます。例: myVarialbe.`class`
は?なぜあなたはそれをしたいのですか?あなたはそれらをl33tで書くことができます、それはコンパイラをだますでしょう。
class cl4ss {
String r3turn() {
return "but why?";
}
}
PL/1 (1960 年代の IBM メインフレーム プログラミング言語で、現在も使用されています) では、一部の単語が特定のコンテキストでキーワードのように機能する一方で、すべての単語を識別子として使用できることを要求したことは有名です。パーサーで一貫性を持たせようとすれば、これを行うのはそれほど難しくありません。PL/1 はかなり大きな言語と見なされており、言語委員会は、多くのプログラマーがそのすべてを学習するわけではなく、知らない部分のキーワードを識別子として使用しようとすると驚かれるのではないかと心配していました。 . したがって、次のように書くことができます。
IF BEGIN=ELSE THEN CALL=3 ELSE CALL FOO(ENDIF) ENDIF
他の人がここで指摘しているように、これを行う機能は推奨されません。
Java の設計者は、この言語のキーワードの数は控えめであると判断し、そのセットを予約しました。実際の Java プログラムでは実際には許可されていない「GOTO」も予約されています。
javacコンパイラで予約語を使用する方法はありません。
技術的には、クラス ファイル内の名前を編集して、必要な名前に変更できます。この段階では、VM はソース コードを処理していないため、気にしません。一部の難読化者はこの手法を使用していると思います。