web-dev-qa-db-fra.com

En Java, pouvons-nous diviser une classe en plusieurs fichiers

Toute possibilité de diviser une classe en plusieurs fichiers physiques en utilisant Java?

41
user496949

Non, l'intégralité d'une classe doit être dans un seul fichier en Java.

Si vous pensez à la fonctionnalité "types partiels" de C #, il n'y a pas d'équivalent en Java. (Si vous ne pensiez pas à C #, ignorez ceci :)

32
Jon Skeet

Cela pourrait être une bonne idée si la classe est vraiment si grande que les concepts mis en œuvre ne sont pas faciles à comprendre. Je vois deux façons différentes de le faire:

  1. Utilisez l'héritage: Déplacez les concepts généraux de la classe dans une classe de base et dérivez-en une classe spécialisée.

  2. Utilisez l'agrégation: Déplacez des parties de votre classe dans une classe séparée et établissez une relation avec la seconde classe à l'aide d'une référence.

Comme mentionné précédemment, il n'y a pas de concept similaire aux classes partielles en Java, vous devez donc vraiment utiliser ces mécanismes OOP.

10
spa

En utilisant seulement javac, ceci n'est pas possible. Vous pouvez bien sûr combiner plusieurs fichiers en un seul fichier .Java dans le cadre de votre processus de construction et appeler javac par la suite, mais cela serait fastidieux à tant de niveaux qu'il serait peu probable qu'il soit utile.

Peut-être que vous pourriez expliquer votre problème, alors nous pourrons mieux vous aider.

Si vous pensez que vos fichiers .Java sont trop volumineux, vous devriez probablement envisager de le refactoriser.

6
sleske

Bien sûr que c'est possible, mais je ne pense pas que ce soit utile du tout.

Pour commencer, la division n’est pas vraiment la question, je suppose, vous devez simplement compiler le fichier et le diviser comme vous le souhaitez.

Maintenant, pour les rassembler, il vous suffit d'écrire un chargeur de classes personnalisé qui charge toutes les pièces, les combine dans un tableau d'octets unique, puis appelle defineClass().

Comme je l'ai dit, cela semble assez inutile et ce n'est probablement pas ce que vous voulez et certainement pas ce dont vous avez besoin, mais c'est techniquement possible.

(J'ai fait quelque chose de similaire une fois pour blaguer le code: les octets du fichier de classe étaient dispersés dans les constantes de toutes les autres classes de l'application. C'était amusant, je dois l'avouer.)

3
biziclop

Non, cela ne peut pas être fait en Java.

2
Peter Knego

Non tu ne peux pas. Si votre classe est trop grande, vous devriez la diviser en deux ou plus.

1
byyyk

Oui, vous pouvez!

Par souci d'achèvement:

Depuis Java 8, vous avez le concept de méthodes par défaut.

vous pouvez diviser votre classe en plusieurs fichiers/sous-classes en douceur ab en utilisant des interfaces

observer:

MyClassPartA.Java

interface MyClassPartA{
    public default int myMethodA(){return 1;}
}

MyClassPartB.Java

interface MyClassPartB{
    public default String myMethodB(){return "B";}
}

et combinez-les:

MyClass.Java

public class MyClass implements MyClassPartA, MyClassPartB{}

et les utiliser:

MyClass myClass = new MyClass();

System.out.println(myClass.myMethodA());
System.out.println(myClass.myMethodB());

Vous pouvez même passer des variables entre classes/fichiers avec des getters et des setters abstraits que vous devrez réaliser/redéfinir dans la classe principale, ou une super-classe de celle-ci.

0