web-dev-qa-db-ja.com

Javaでファイルを#includeするにはどうしますか?

C++環境から来て、必要な関数の多くをfuncs.hファイルに分割し、#include "funcs.h"を実行して、関数のプロトタイプをメインの.cppファイルに追加することに慣れました。 Java(主にminecraft ModloeaderMp)で)作業を開始し、いくつかの事前作成された関数(ファイルコピー用のいくつかの関数など)があるfuncs.Javaファイルをすでに作成しました。アイテムなど)。既にステートメントPublic class mod_mine extends BaseModMpを使用しているので、関数をインポートする方法はありますか、または別のPublic class mod_mine extends funcsを実行できますか?

11
MrJackV

あなたはしません#include Javaでは、あなたimport package.Class。 Java 6(または5でしたか?))なので、import static package.Class.staticMethodOfClass、これはあなたがやろうとしていることのいくつかの形を達成するでしょう。

また、@ duffymoが述べたように、importは、インポートされたクラス名にパッケージ名のプレフィックスを付けること、またはインポートされた静的メソッド名にパッケージ名とクラス名をプレフィックスとして付けることのみを保存します。実際の#includeセマンティクスがJava-にまったく存在しません。

とは言っても、 "funcs.Java"ファイルがあると、つま先をいくつかのアンチパターンに浸し始めているように見えます...そして、これらに近づかないでください。

22
Romain

Javaには#includeはありません。

すべての変数を格納するfuncs.Javaのあるデザインは好きではありません。オブジェクトは、単一のコンポーネントにカプセル化された状態と動作です。そうした場合、オブジェクト指向の方法で設計しているわけではありません。

良い名前は重要です。 Stuff2を拡張するStuffという名前のクラスは、悪い例である方がよいでしょう。

それは良いJavaではありません。私もそれが良いC++だとは思わないでしょう。

9
duffymo

すべてのメソッドを同じクラスに入れているように思えます。それらを分離する必要があります:

ユーティリティクラス

これらには、ファイルのコンテンツの取得、ダイアログ画面の表示、2つの数値の加算などの処理を行う静的メソッドが含まれている必要があります。それらは実際にはオブジェクトクラスに属しておらず、インスタンスを必要とせず、プログラム全体で広く使用されています。この良い例については Java.lang.Math を参照してください。

定数クラスまたは構成ファイル

これは、_static final_のような_PI = 3.1415_メンバーを含むConstantsクラスにすることができます。 _Constants.PI_を使用してそれらにアクセスできます。

または、構成ファイルを使用してそれらをConfigurationにロードし、config.get("database")のようなもので構成変数にアクセスできます。

その他

コードがこれらのいずれにも当てはまらない場合は、コードが オブジェクト指向プログラミングの概念 に適合するように、いくつかのクラスにコードを配置する必要があります。あなたの質問から、あなたはこれについて読みたいと思うでしょう。私は最初に Head First Java を読んでから、多分 Javaのオブジェクト指向プログラミング に関する他の本を読むでしょう。その後、いくつかの デザインパターン を確認します。

3
skyuzo

Javaはオブジェクト指向プログラミング言語であり、それには理由があります。

Javaには#includeはありませんが、他のパッケージからクラスをインポートできます。変数を格納するために別のクラスfunc.Javaを作成することは、それらがすべて定数になるまで、または定数でない限り、良い考えではないかもしれません。あるクラスを拡張することにより、uは関数を再利用できます。しかし、拡張クラスはISテストに合格します。そうでない場合、これは悪い考えかもしれません。

C++から移行する場合は、Head First Javaのように、いくつかの良い本を読んでみると非常に役立ちます。

3
Zohaib

Javaには#includeはありません。importステートメントを使用して、クラスとインターフェースをファイルで使用できるようにすることができます。

2
user496934

JavaファイルでCプリプロセッサを実行できます。-Pフラグを使用して、行の注釈を無効にしてください。Googleをすばやく検索すると、これが2回以上試行され、さらには使用されていることが確認されます。人気のあるfastutilライブラリ:

これはすべてのディレクティブ(#include、#define、#ifdefなど)で機能し、構文的にも意味的にもC/C++の同等のステートメントと同じです。

0
Adam P. Goucher

実際に... Cの#includeと同じセマンティクスを持つ方法があります(このキーワードは、見栄えをよくするために後でC++から借用されました)。それは同じ言葉で定義されていないだけでなく、まさにあなたが探しているものを実行します。

最初に、質問を理解するためにC++で#includeをどのように処理するかを見てみましょう。

  • #definesを含める、
  • 「フォワード」関数の定義(「ボディ」はクラス実装で別の場所で定義されています。TurboPascalを覚えていれば、私のポイントがわかります)、
  • 構造を定義し、

それでおしまいです。

構造定義については意味がありません。それは古いCです。C++では年齢に対してstruct {}をもう定義せず、プロパティとアクセサメソッドを使用してclass構造を定義します。同じです。 Javaの場合:typedef struct {}もここにはありません。

これについては、「インターフェース」宣言があります。 https://docs.Oracle.com/javase/tutorial/Java/IandI/createinterface.html を参照してください

それはあなたが探しているものを正確に実行します:

    public interface MyDefines {
        final CHAR_SPACE : ' ';               // ugly #define
        int detectSpace(FileInputStream fis); // function declaration
        // and so on
    }

次に、使用するには:

    public class MyClass extends MyAncestor implements MyDefines {
        ...
        // implementation of detectSpace()
        int detectSpace(FileInputStream fis) {
            int ret = 0;
            char Car;
            if((Car = fis.read()) != -1) && (Car == CHAR_SPACE)) ret++;
            ...
        }

上記のリンクを読んでください。役立つケースがたくさんあります。

0
догонят