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
?
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.
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.
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 .
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.
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.
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++.
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:
#defines
,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.