10
votes

Extenser BigDecimal?

J'ai un peu de code juste à l'aide de BigDecimal Classe et je déteste la maladresse de l'interface.

J'ai soulagé la douleur de l'utilisation de BigDecimal S Avec des entiers en créant une classe d'assistance avec des méthodes statiques avec les méthodes suivantes: xxx

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.

si j'explanie BigDecimal 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.

Comment approcheriez-vous ce problème?


1 commentaires

Intéressant, j'ai fait presque exactement les mêmes méthodes statiques de mon code. Pour moi, il est fou que BigDecimal n'a pas de .Divide (dividende bigdecimal, Int diviseur) 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 comme diviseur dans l'un des calculs de mon code. (Ne pas dire que les cas n'existent pas, mais INT Comme le diviseur semble être le scénario le plus probable que ce serait la peine d'être compris dans la bibliothèque standard).


5 Réponses :


4
votes

ne pas étendre bigdecimal , utilisez une classe wrapper autour d'elle (comme vous l'avez) ou un autre cadre comme les mathématiques des communes.

dfp semble similaire à ce que vous voulez - org.apache.commons.math.dfp.dfp


3 commentaires

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



0
votes

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 {
...
}


1 commentaires

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).



3
votes

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>

  • 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 est un fort> bigdecimal, ainsi que quelque chose de plus. p> li>

  • 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 NE PAS FORT> DÉRISER DEGDECIMAL. Au lieu de cela, vous utiliser em> interne un bigdecimal et vous délégué em> certaines des fonctionnalités exposées par votre API personnalisée. Ce scénario est celui où votre classe personnalisée a un strong> bigdecimal, mais ce n'est pas un bigdecimal. P> li> ul>

    puis pour envelopper une méthode bigdecimale pour renvoyer votre type personnalisé: p>

    avec insertance, vous feriez quelque chose comme ce qui suit: P>

    public static BigDecimal divide(BigDecimal first, int second)
    {
        return first.divide(second);
    }
    


2 commentaires

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 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!



-4
votes

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.


2 commentaires

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 () n'est qu'un jouet de débogage.



5
votes

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>

  • Il n'est pas très proche de la notation mathématique habituelle li>
  • Il est asymétrique pour les opérateurs symétriques comme Ajout et Multiplier Li> ul>

    [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);
    


1 commentaires

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.