是否可以进行静态方法的类型间声明?

时间:2014-09-11 10:40:01

标签: java aspectj static-methods aop

使用静态方法考虑使用以下类:

public class Vector2D {      
    /* ... */
    public static Vector2D sum(Vector2D first, Vector2D second) {
        return new Vector2D(first.x + second.x, first.y + second.y);
    }
}

此方法也可以作为AspectJ中的类型间声明添加:

public aspect Vector2DMath {
    public static Vector2D Vector2D.sum(Vector2D first, Vector2D second) {
        return new Vector2D(first.x + second.x, first.y + second.y);
    }
}

哪种方法在面向方面编程方面更正确?

就个人而言,我认为第一种方法更好(代码更少),但如果是这样,那么当静态方法的类型间声明可能有用时?

2 个答案:

答案 0 :(得分:1)

IMO静态方法ITD实际上只对代码生成有用(spring roo就是一个例子)类似于C#部分类,它将代码生成器代码保存在与开发人员代码不同的文件中。

是的,第一种方法是比第二种方法更好的方法。

答案 1 :(得分:1)

比较苹果和梨是没有意义的。这里没有“更好”或“更糟”,只有情境决定:

  • 每当您有权访问类的源代码并且要添加的方法实现核心问题时,请使用OOP (编辑:修复拼写错误,我之前写过“AOP”)
  • 如果您无法访问源代码,并且继承对于实现核心问题不是一个好的甚至可行的解决方案,请使用AOP作为解决方法。
  • 如果您希望跨越多个类甚至整个系统实现跨领域的关注,请始终使用AOP,无论您是否拥有源代码访问权限,因为这是AOP帮助您更好,更清洁地写入的地方,更多模块化和更易维护的代码。

说完这个并看一下你的例子,似乎Vector2D.sum几乎解决了一个核心问题,所以如果你不一定需要AOP来解决“无源代码”问题,那么使用OOP和只需编辑课程。在其他情况下,决定可能会有所不同。 ITD for(非)静态方法是一种有用的AOP工具。

编辑:我忘了提到静态方法通常“糟糕”,因为很难对它们进行模拟测试。并非总是如此,但往往它们有点老式的C风格。在这个具体的例子中,为什么要创建一个静态方法来添加同一个类的两个实例?为什么常规sum方法不能采用一个参数?

相关问题