web-dev-qa-db-fra.com

Comment pouvez-vous inclure des fichiers en java?

Venant d’un environnement C++, je me suis habitué à scinder un grand nombre des fonctions dont j’avais besoin dans un fichier funcs.h, à faire ensuite #include "funcs.h", puis à ajouter les prototypes de fonctions dans le fichier principal .cpp. Maintenant, je commence à travailler avec Java (principalement avec minecraft ModloeaderMp) et j’ai déjà créé un fichier funcs.Java contenant des fonctions prédéfinies (par exemple, certaines fonctions de copie de fichiers, donnant des piles d’articles, etc.). Depuis que j’utilise déjà l’instruction Public class mod_mine extends BaseModMp, puis-je importer les fonctions ou puis-je créer un autre Public class mod_mine extends funcs?

9
MrJackV

Vous n'avez pas #include en Java, vous import package.Class. Depuis Java 6 (ou était-ce 5?), Vous pouvez aussi import static package.Class.staticMethodOfClass, ce qui donnerait certaines formes à ce que vous essayez de faire.

De plus, comme @duffymo l'a noté, import vous évite uniquement de préfixer systématiquement les noms de classe importés avec le nom du package, ou les noms de méthodes statiques importés avec le nom du package et de la classe. La sémantique actuelle #include n’existe pas du tout.

Cela dit, avoir un fichier "funcs.Java" me semble comme si vous commenciez à plonger vos orteils dans des anti-patterns ... Et vous devriez rester à l'écart de ceux-ci.

19
Romain

Il n'y a pas #include en Java.

Je ne voudrais pas d'une conception qui a un funcs.Java qui stocke toutes les variables. Les objets sont des états et des comportements encapsulés dans un seul composant. Si vous faites cela, vous ne concevez pas de manière orientée objet.

Les bons noms comptent. Une classe nommée Stuff qui étend Stuff2 devrait tout simplement être un mauvais exemple. 

Ce n'est pas bon Java. Je ne considérerais pas que ce soit un bon C++ non plus.

9
duffymo

On dirait que vous mettez toutes vos méthodes dans la même classe. Vous devriez les séparer:

Classes utilitaires

Celles-ci doivent contenir des méthodes statiques comme obtenir le contenu d'un fichier, afficher un écran de boîte de dialogue ou ajouter deux nombres. Ils n'appartiennent pas vraiment à une classe d'objet, ils ne nécessitent pas d'instances et sont largement utilisés tout au long du programme. Voir Java.lang.Math pour un bon exemple.

Classe constante ou fichiers de configuration

Cela peut être une classe Constants qui contient des membres static final, tels que PI = 3.1415. Vous pouvez y accéder en utilisant Constants.PI.

Ou, vous pouvez utiliser des fichiers de configuration et les charger dans Configuration et accéder aux variables de configuration avec quelque chose comme config.get("database")

Autre

Si votre code ne rentre dans aucun de ceux-ci, vous voudrez le mettre dans une classe telle qu'il convienne/ concepts de programmation orientés objet . D'après votre question, il semble que vous souhaitiez en savoir plus à ce sujet. Je voudrais d’abord lire Head First Java , puis peut-être quelques autres livres sur la programmation orientée objet en Java . Après cela, je regarderais quelques modèles de conception .

3
skyuzo

Java est un langage de programmation orienté objet et il y a une raison à cela.

Il n’existe pas de #include en Java, bien que vous puissiez importer des classes à partir d’autres paquetages . Créer une classe séparée func.Java pour stocker des variables peut ne pas être une bonne idée, à moins que toutes ne soient constantes. En étendant une classe, vous pouvez réutiliser la fonction. mais est-ce que l'extension de la classe passe le IS Un test, sinon que cela pourrait être une mauvaise idée.

Si vous passez du C++, consulter un bon livre, par exemple, Head First Java pourrait beaucoup vous aider.

3
Zohaib

Il n'y a pas de #include en Java. vous pouvez utiliser l'instruction import pour rendre les classes et les interfaces disponibles dans votre fichier.

2
user496934

Vous pouvez exécuter le préprocesseur C sur un fichier Java en vous assurant d'utiliser l'indicateur -P pour désactiver les annotations de ligne. Une recherche rapide dans Google confirme que cela a été tenté au moins deux fois, et est même utilisé dans la bibliothèque populaire fastutil:

Cela fonctionne pour toutes les directives (#include, #define, #ifdef, etc.) et est identique sur le plan syntaxique et sémantique aux instructions équivalentes en C/C++.

0
Adam P. Goucher

En fait ... Il existe un moyen d'avoir la même sémantique que dans #include de C (le mot clé a ensuite été emprunté par C++ pour des raisons de fantaisie ...). Ce n'est tout simplement pas défini avec les mêmes mots, mais il correspond exactement à ce que vous recherchez.

Tout d’abord, voyons ce que vous faites avec #include en C++ pour comprendre la question:

  • inclure #defines,
  • définitions de la fonction "forward" (leur "corps" étant défini ailleurs, dans une implémentation de classe, si vous vous souvenez du Turbo Pascal, vous comprenez mon point),
  • définir des structures,

et c'est à peu près tout.

Pour les définitions de structure, cela ne sert à rien. C: old-school: en C++, vous ne définissez plus struct {} depuis des âges, vous définissez des structures class avec des propriétés et des méthodes d'accès, c'est la même chose en Java: ici non plus typedef struct {}.

Pour cela, vous avez la déclaration "interface", voir https://docs.Oracle.com/javase/tutorial/Java/IandI/createinterface.html

Il fait exactement ce que vous recherchez:

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

Ensuite, utiliser:

    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++;
            ...
        }

Lisez le lien ci-dessus, c'est plein de cas utiles.

0
догонят