J'ai un peu de code juste à l'aide de J'ai soulagé la douleur de l'utilisation de C'est tout ce dont j'ai besoin pour l'instant et que le code est un peu plus lisible qu'auparavant. Cependant, je lis que les méthodes statiques sont une «mauvaise» chose et qu'ils ne suivent pas OO-Princes. P> si j'explanie Comment approcheriez-vous ce problème? P> P> BigDecimal CODE> Classe et je déteste la maladresse de l'interface.
BigDecimal code> S Avec des entiers en créant une classe d'assistance avec des méthodes statiques avec les méthodes suivantes: p>
BigDecimal code> Cependant, je définirais un nouveau Tapez et je devrais donc réaffiner toutes les méthodes pour les envelopper avec mon objet ou je ne pourrai pas utiliser les résultats avec les méthodes augmentées. Cela ne semble pas une chose intelligente à faire. P>
5 Réponses :
ne pas étendre bigdecimal code>, utilisez une classe wrapper autour d'elle (comme vous l'avez) ou un autre cadre comme les mathématiques des communes. P>
dfp code> semble similaire à ce que vous voulez - org.apache.commons.math.dfp.dfp p>
Je vais jeter un oeil à DFP. Donc, une classe d'emballage contiendrait un grossière à l'intérieur de l'objet, je suppose que, comme il n'est pas liée à BigDecimal, je devrais réécrire toutes les méthodes qui déléguent à BigDecimal plus toutes mes méthodes. Comment cette approche pourrait-elle être supérieure? Il semble à peu près le même effort d'extension de BigDecimal. J'essaie juste de comprendre, je serais heureux d'être prouvé comme mal.
En pensant plus, ce serait supérieur, car je n'ai pas besoin de fournir toutes les méthodes, seulement celle dont j'ai besoin et donc je ne mélangerais pas les cas mybigdecimal et bigdecimaux.
Lien vers org.apache.commons.math.dfp.dfp n'est plus valide
Si vous créez une classe qui étend une autre classe (c'est-à-dire BigDecimal dans votre cas), la classe enfant a toujours toutes les propriétés de la classe mère (Super). Dans votre cas, si vous écrivez:
public class UsableBigDecimal extends BigDecimal { ... }
MyBigDecimal serait une instance de BigDecimal et pourrait être utilisée comme tel, mais pas le contraire, donc si j'appelle une méthode de la classe de base sur la classe dérivée, il renvoie une nouvelle instance de classe de base et je ne peux pas utiliser les méthodes de classe dérivées. plus sur celui-ci (sauf avec un constructeur de copie, mais cela rendrait le code encore plus maladroit).
Si vous devez utiliser la plupart em> des méthodes de BigDecimal API, ainsi que de vos propres méthodes supplémentaires, alors je vous suggère de hériter de votre classe personnalisée de BigDecimal. De cette manière, vous n'avez pas besoin de définir des emballages pour les méthodes de bigdecimales qui fonctionnent déjà bien pour vous. Ce scénario est celui où votre classe personnalisée Si vous n'avez besoin que d'un peu de méthodes em> à partir de BigDecimal API, ainsi que de vos propres méthodes supplémentaires, alors je vous suggérerais de vous puis pour envelopper une méthode bigdecimale pour renvoyer votre type personnalisé: p> avec insertance, vous feriez quelque chose comme ce qui suit: P> Pourriez-vous s'il vous plaît clarifier à moi ce que vous voulez dire exactement avec "Je définirais un nouveau type et je devrais donc réaffiner toutes les méthodes pour les envelopper avec mon objet ou je ne serai pas capable d'utiliser les résultats avec les méthodes augmentées. "? Strike>
public static BigDecimal divide(BigDecimal first, int second)
{
return first.divide(second);
}
Par exemple, si je définis MyBigDecimal s'étend à BigDecimal si j'utilise une méthode définie dans la classe de base, il retournera un bigdecimal et donc le code comme celui-ci ne fonctionnera pas: nouveau myBigDecimal ("12,89"). Divisez (autreBigDecimal) .methodofmybi gdecimal ( )
Ok, je l'ai eu. Donc, oui, vous devriez envelopper les méthodes originales BigDecimales dont vous avez besoin avec votre propre version. Notez juste que cet emploi Emballage i> doit être fait quel que soit le choix que vous prenez, qu'il s'agisse d'héritage, de délégation, mais également de vos fonctions d'assistance statique que vous faites cela!
J'oublierais ce problème et le problème initial et s'habitue à l'API de BigDecimal telle qu'elle est. Tout ce que vous faites, c'est créer des problèmes pour vous-même, car l'existence de cette question démontre. P>
Disons que je souhaite utiliser un format fixe pour afficher toutes les décimales, idéalement, je vais remplacer la totring. Un moyen naturel de faire cela s'étend de BigDecimal, mais cela nécessite de remplacer ses constructeurs aussi, je préfère l'envelopper.
@LLUISMARTINEZ La façon naturelle de faire est réellement d'écrire une nouvelle classe de format. TOSTRING () CODE> n'est qu'un jouet de débogage.
Je le ferais exactement comme vous l'avez!
Toutes les décisions de conception de ce type doivent être basées sur un souhait de rendre le code plus maintenu pour le prochain programmeur qui prendra le contrôle du code après vous. C'est pourquoi nous fabriquons le développement basé sur la conception et la composante O-O en premier lieu. P>
mais compte tenu de la syntaxe de Java, il est très difficile de faire une API pour des expressions basées sur les mathématiques. J'ai deux problèmes avec l'API de Biginteger actuel: P>
[La surcharge de l'opérateur est l'une des rares caractéristiques de C ++, je manque à Java] P>
qui est plus lisible? p>
int a = ...; BigInteger b = ...; BigInteger c = BigInteger.valueOf(a).divide(b);
Je suppose qu'après tout est la solution la plus simple plus sûre, car si je enveloppe BigDecimal, cela ne fonctionnera plus avec JDBC.
Intéressant, j'ai fait presque exactement les mêmes méthodes statiques de mon code. Pour moi, il est fou que
BigDecimal code> n'a pas de
.Divide (dividende bigdecimal, Int diviseur) code> méthode intégrée. Quand était la dernière fois que vous aviez besoin de diviser quoi que ce soit d'une décimale? Je n'ai jamais eu autre chose que
int code> comme diviseur dans l'un des calculs de mon code. (Ne pas dire que les cas n'existent pas, mais
INT CODE> Comme le diviseur semble être le scénario le plus probable que ce serait la peine d'être compris dans la bibliothèque standard).