当前位置: 首页 > 面试题库 >

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

越麒
2023-03-14
问题内容

我首先想到了使用ITD来private static final Logger logger = ...为一些不相关的情况定义,但是用它作为演示示例看起来还不是一个明显的改进。

是否有一些ITD使用的标准/建议示例,人们应该将其用于教学目的?


问题答案:

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

使用方面是改善软件和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,这是您无法做的,仅是将一个建议,该建议所需的数据以及最终将对该数据进行操作的方法封装在一个编译单元中。



 类似资料:
  • 问题内容: 我试图使代码更具可读性,所以我决定使用一些简短的IF语句。 这是我的无效代码(“不是声明”): 这怎么了 需要括号吗?哪里? 问题答案: “三元表达式” 只能用于条件 赋值 。也就是说,您可以执行以下操作: 因为三元表达式返回的东西(在此示例中为类型)。 它并不是真的打算用作短的,在线的。特别是,如果各个部分不返回值或返回不兼容类型的值,则不能使用它。(因此,如果两个方法都碰巧返回相同

  • 问题内容: 我实际上是从(.NET)学习golang的,对此语言我一无所知。有时我会发现这种声明: https://github.com/golang/crypto/blob/master/ed25519/ed25519.go 到底是什么意思?它是从[] byte继承的结构吗? 只是别名吗? 我以为golang禁止继承。 问题答案: 这是一个类型声明,更具体地说是一个 类型定义 。它创建一个新类型

  • 本文向大家介绍举例说明什么是短路求值?相关面试题,主要包含被问及举例说明什么是短路求值?时的应答技巧和注意事项,需要的朋友参考一下 短路求值即利用 (逻辑或) 和 (逻辑与)的短路特性进行赋值: 当值为truthy时,取的值,否则取。这样可以避免被赋为、、、等值。 当值为truthy时,再去取并返回其值,否则返回。这样可以避免为空时,报空指针异常。

  • 问题内容: 我有以下代码片段。 以下摘要是否正确(仅针对上面的 简短示例)? 但是, 考虑到之前的摘要,为什么我确实需要转换第二个方法调用的参数? 问题答案: 这些是相关的JLS部分: [JLS 5.1.1身份 Conversion](http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.1) 任何类型

  • 我试图在Hibernate中映射PostgreSQL表。我正在写一个POJO类。有一列带有类型。如何在POJO类中为getters和setter方法声明java数据类型? 和不工作。

  • 我正在学习JavaScript及其库jQuery。我不知道为什么允许这种类型的声明(snake.x)而没有“let”或任何东西。这是我的代码