什么是AspectJ中的类型间声明的简短示例,说明该方法的有用性?

什么是AspectJ中的类型间声明的简短示例,说明该方法的有用性?,第1张

什么是AspectJ中的类型间声明的简短示例,说明该方法的有用性?

我想在亚当的答案中再加上一个例子。

使用方面是改善软件和OOP模块化的一种方法,只是OOP是“垂直”应用而AOP是“水平”应用。

因此,尽管可以使用建议来“水平”修改所有方法的行为以响应某些条件,但是建议中的代码还需要一些数据,ITD可以“水平”添加字段,同时包含在单个编译单元(方面)中相关的数据和代码。

由于您是通过ITD字段添加数据的,因此您可能还希望提供一些 *** 作这些字段的方法,例如setter / getter。

我几次尝试改写它,希望它易于理解。

举个例子,假设您有一个图形编辑程序,用户可以在其中创建,删除和显示许多Shape(相当经典的eh?:D)。

形状具有大量数据,例如,它们具有颜色,坐标等。它们正确地属于类本身。但是,由于这是一个Web
3.0应用程序,因此您希望用户能够在单个图形上进行协作,这意味着每种形状都必须知道何时更改了它,如果已与其他用户交流过该形状已更改,是否需要更改被实际拖动它的某个用户锁定等。

您可以在简单的OOP中执行此 *** 作,在Shape或任何根类中实现相关的部分,但是您将使用“
this.setDirty(true)”之类的调用污染所有的setter。

相反,您决定进行AOP并在一个方面实施它。在这种情况下,您可以轻松地在所有设置器之后添加建议,但是如果您要优化只发送变化增量的网络协议,则还需要存储“脏”布尔值,甚至是更改的属性列表。

你可以像这样实现

public aspect ShapesAreDirtyThings {   private boolean Shape.dirty;   after(Shape s) : execution(* Shape+.set*(..)) {       s.dirty = true;       // Set some other global field, start a thread to communicate        // to other users about the change, whatever ..    }   public boolean Shape.isDirty() {       return s.dirty;   }   public boolean Shape.findDirtyChildren() { // whatever}

对于普通的AOP,这是您无法做的,仅是将一个建议,该建议所需的数据以及最终将对该数据进行 *** 作的方法封装在一个编译单元中。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5426899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存