Я бы использовал шаблон декоратора .
По сути, вам нужно будет хранить экземпляр BigDecimal
в вашем классе CBigDecimal
в качестве частного члена. Для создания CBigDecimal
вам понадобится экземпляр BigDecimal
(который также может быть BigDecimal.ZERO
).
Затем в вашем CBigDecimal
классе вы можете предоставить тот же интерфейс BigDecimal
(вы можете добавить метод CBigDecimal#add(BigDecimal)
), потому что у вас есть экземпляр этого класса в вашем классе, и вы также можете создавать ваши собственные методы (как ваш CBigDecimal#percentage(double)
).
Это пример кода:
CBigDecimal.java:
public class CBigDecimal
{
private BigDecimal bigDecimal;
public CBigDecimal(BigDecimal bigDecimal)
{
this.bigDecimal = bigDecimal;
}
// This method already exists in BigDecimal class, so it will have the same signature
public CBigDecimal add(BigDecimal toAdd)
{
return new CBigDecimal(bigDecimal.add(toAdd));
}
// This is the new method which you will implement as you like
public CBigDecimal percentage(double percentage)
{
BigDecimal multiplied = bigDecimal.multiply(new BigDecimal(percentage));
BigDecimal total = multiplied.divide(new BigDecimal(100));
return new CBigDecimal(total);
}
// This is another method that already exists in BigDecimal class
public double doubleValue()
{
return bigDecimal.doubleValue();
}
}
Затем клиентский код создаст экземпляр вашего CBigDecimal
, предоставив его конструктору BigDecimal
экземпляр.
public class CBigDecimalTest
{
public static void main(String []args)
{
CBigDecimal extendedBigDecimal = new CBigDecimal(new BigDecimal(50));
System.out.println("percentage: " + extendedBigDecimal.percentage(50).doubleValue());
System.out.println("doubleValue: " + extendedBigDecimal.doubleValue());
}
}
P.S .: этот шаблон стоит только тогда, когда вам действительно нужно расширить класс BigDecimal, добавив кучу новых методов. Если вам просто нужно добавить только метод, лучше просто объявить где-нибудь статический метод, как предложено Энди Тернером .