Pourquoi n'est-ce pas getClass() disponible comme une méthode statique?

En statique contextes, comment se fait que vous ne pouvez pas appeler une version statique de getClass() (plutôt que d'avoir à utiliser my.package.name.MyClassName.class) ?

N'est pas le compilateur assez intelligent pour savoir quand utiliser des méthodes d'objet + lors de l'utilisation de méthodes statiques?


REMARQUE pour plus de clarté:

Je ne dis pas qu'un static getClass() doit être utilisé au lieu de la non-méthode statique getClass() (c'est assez évident-si SpecialFoo est une sous-classe de Foo, puis le getClass() d'un Foo pourrait revenir Foo.class ou SpecialFoo.class ou de quelque chose et il doit être déterminé au moment de l'exécution).

Je dis que je me demandais pourquoi il n'existe pas de deux versions de getClass(), qui est une méthode statique qui ne s'applique que dans un contexte statique, et la non méthode statique getClass(). Si il n'est pas possible, alors il n'est pas possible, et c'est la réponse. Si c'est possible, mais n'a pas été fait, c'est un choix historique, et peut-être il ya une bonne raison pour cela. C'est ce que j'aimerais savoir.

Il serait bon de déclarer

final static Logger logger = LoggerFactory.getLogger(getClass());

au lieu de

final static Logger logger = LoggerFactory.getLogger(my.package.name.MyClass.class);

où le premier peut être copiée mot pour mot d'une classe à l'autre, tandis que le second vous oblige à copier le nom de la classe dans chaque fichier.

  • Bonne question. Groovy permet this de référence à la classe actuelle dans un contexte statique 😉
  • Probablement parce que, au moment de l'exécution des méthodes statiques qui n'ont aucune classe.
  • Droit, mais à partir du compilateur, point de vue, lorsque vous appelez une méthode statique foo(), il sait foo() se réfère à la méthode statique. Je crois que je vais poser est de savoir pourquoi il n'y a pas un getClass() méthode statique qui renvoie la builtin statique .class champ.
  • Il semble probable qu'il n'y a pas de getClass() parce que de retour dans la journée, les développeurs du langage java, de mettre dans la .catégorie de la propriété et de la pensée "qui est assez bon". Un peu comme le Tableau.la longueur de la propriété.
  • Éventuellement, une méthode n'est pas la bonne solution, mais moyen de faire référence à la Class objet de la classe actuelle, ce serait bien. Peut-être this.class comme un cas particulier de la Class littérale toujours en se référant à la classe contenant l'expression.
  • Je suppose que je devrais re-titre; mon point n'est pas tellement pourquoi n'est-il pas présent, mais est-il possible que cela puisse être fait.
  • Si c'est possible, mais n'est tout simplement pas mis en œuvre, alors que j'avais proposer pour le prochain Projet-forme de Pièce de monnaie de l'effort. Mon code est plein de final static Logger logger = LoggerFactory.getLogger(my.package.name.MyClassName.class) lignes qui ne sont pas facilement maintenable.
  • Pourquoi le nom pleinement qualifié de la classe lorsque vous êtes dans cette classe déjà? MyClassName.class devrait suffire.
  • Je ne sais pas pourquoi vous pensez que ce n'est pas facilement maintenable. Puisque vous êtes en train d'ajouter que l'exploitant init sein même de la classe le nom de la classe ne doit jamais changer, sauf si vous renommer la classe et c'est l'unité de compilation qui est très rare. Aussi comme colinD dit, le paquet est redondant, vous êtes déjà dans la classe que vous n'en avez pas besoin.
  • SEC -- c'est quand vous copiez le code d'une classe à l'autre. Aussi loin que la modification du nom, de l'Éclipse du refactoring des poignées de cas correctement.
  • On dirait qu'il est temps pour moi d'utiliser un autre Lombok fonction -- projectlombok.org/features/Log.html

InformationsquelleAutor Jason S | 2011-04-20