Java类添加方法

时间:2018-09-03 20:19:44

标签: java android bigdecimal

早上好,我有一个自定义类cBigDecimal,它扩展了BigDecimal类。我的目标是同时使用BigDecimal和cBigDecimal类中的方法(例如“ add”或“ multiply”以及自定义函数“ percentage”)。问题是“添加”和合。返回BigDecimal,显然我无法将其转换为cBigDecimal ...有什么想法吗? 提前致谢, 洛伦佐

3 个答案:

答案 0 :(得分:3)

您的cBigDecimal类到底做了什么而BigDecimal没有做什么?

BigDecimal可以完全扩展是设计疏忽。乔什·布洛赫(Josh Bloch)在有效Java 第三版第17条中说:“最小化可变性”:

  

人们普遍认为,在编写BigIntegerBigDecimal时,不变类必须有效地终结,因此它们的所有方法都可能被覆盖。不幸的是,在保留向后兼容性的同时,这不能纠正。

如果您要做的只是向BigDecimal“添加方法”,则可以简单地创建一个辅助方法:

static BigDecimal percent(BigDecimal b) {
  return b.divide(100);  // Or whatever it does.
}

然后,您可以在任何地方处理普通的旧BigDecimal

答案 1 :(得分:0)

请勿扩展BigDecimal

BigDecimal类不可不被覆盖。应该将该类标记为final以便在编译器中强制执行此限制,但是,遗憾的是,它并不是这样标记的(不幸的疏忽)。因此,请勿覆盖BigDecimal

如果想到除BigDecimal / BigInteger以外的其他课程,您可以阅读我的答案的其余部分。

多态

polymorphism中了解有关 Object-Oriented Programming 的信息。

如果将对类型为Dog的对象的引用分配给超类Animal类型的变量,并且子类覆盖方法eat,则调用方法{{1} }导致子类上的方法被执行。这就是late-bindingdynamic-dispatch的魔力(此“正确执行权利”行为的各种术语)。

eat

注意事项:确保打算重写您的超类及其方法。如果标记为Animal x = new Dog( … ) ; // Polymorphism: Viewing a `Dog` object as an `Animal` object. x.eat( … ) ; // Results in Dog::eat method being invoked, *not* Animal::eat. ,则不会。

命名

提示:请遵循命名约定。类始终以大写字母开头。使用final,而不是MySubClass作为类名。

答案 2 :(得分:0)

我会使用decorator pattern

基本上,您将必须在WHERE类中以私有成员的身份持有BigDecimal的实例。要创建CBigDecimal,您将需要一个CBigDecimal(也可以是BigDecimal)的实例。

然后,在您的BigDecimal.ZERO类中,您可以提供与CBigDecimal相同的接口(可以添加方法BigDecimal),因为您在类中具有该方法的实例,并且您还可以创建自己的自定义方法(作为CBigDecimal#add(BigDecimal))。

这是示例代码:

CBigDecimal.java:

CBigDecimal#percentage(double)

然后,客户端代码将通过向其构造函数提供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

P.S .:仅当您确实需要通过添加一堆新方法来扩展BigDecimal类时,此模式才值得。如果您只需要添加一个方法,则最好按照Andy Turner's answer的建议在某个地方声明一个静态方法。