[解決済み] Javaソースファイルにマクロを入れることはできますか
質問
私のプログラムでは、コンソールから何度も整数を読み取っています。毎回、この行をタイプする必要があります。
new Scanner(System.in).nextInt();
C/C++に慣れているので、以下のような定義ができないか?
#define READINT Scanner(System.in).nextInt();
そして、私のJavaプログラムのすべての場所で、私は次のようにフォームコンソールを読むことができます。
int a = new READINT;
しかし、私は、Javaがマクロをサポートしていないフォームの本を読んだ。
なぜそうなのか、また他の方法でこれを行うことができるのか、どなたか教えてください。
どのように解決するのですか?
あなたは 可能 しかし、あなたは いけない .
は いけません の部分です。
あなたは はいけません。 なぜなら、そのような方法でプリプロセッサを使用すると はバッドプラクティスと考えられています。 このユースケースを解決するには、より良い、よりJava的な方法があります。
は できる の部分になります。(*)
Java自身はマクロをサポートしていません。一方、ソースコードをパイプでつないで Cプリプロセッサ (略称:CPP)が、C/C++コンパイルチェーンが行うのと同じように。
以下はデモです。
src/Test.java
:
#define READINT (new java.util.Scanner(System.in).nextInt())
class Test {
public static void main(String[] args) {
int i = READINT;
}
}
cpp
コマンドを使用します。
$ cpp -P src/Test.java preprocessed/Test.java
結果
class Test {
public static void main(String[] args) {
int i = (new java.util.Scanner(System.in).nextInt());
}
}
コンパイルしてください。
$ javac preprocessed/Test.java
より良い回避策を
代わりにスタティック・メソッドを持つ独自のユーティリティ・クラスを書くことができます。
import java.util.Scanner;
class StdinUtil {
public final static Scanner STDIN = new Scanner(System.in);
public static int readInt() {
return STDIN.nextInt();
}
}
そして、使いたいときには、静的にインポートして
readInt
メソッドを使用します。
import static StdinUtil.readInt;
class Test {
public static void main(String[] args) {
int i = readInt();
}
}
(または
static import StdinUtil.STDIN;
を使用し
STDIN.nextInt()
.)
そして最後に、逸話をご紹介します。
私自身、JavaのコードにCPPの前処理を使ったことがありますよ。ある講座でプログラミングの課題を作っていたときのことです。私は、参照解からコードのスケルトンを簡単に抽出できるようにしたかったのです。そこで、私はただいくつかの
#ifdef
を使用して、解答の「秘密」の部分をフィルタリングしています。そうすることで、参照解を維持しながら、簡単にコードスケルトンを再生成することができるのです。
この投稿は記事としてリライトされています こちら .
(*) 私は、質問に答えるときに、"you shouldn't" と答えるのが嫌いなので。それに、将来、読者が
cpp
をJavaのソースと組み合わせて使うことができます。
関連
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] Java: getInstanceとStaticの比較
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み】JSP 2を使用して、JSPファイル内のJavaコードを回避するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜJPAには@Transientアノテーションがあるのですか?
-
[解決済み] 一部の入力ファイルが非推奨のAPIを使用またはオーバーライドしている
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] init-paramとcontext-param
-
[解決済み] java.io.IOException。DER長の短い読み取り