模块 jdk.dynalink

类 NamespaceOperation

java.lang.Object
jdk.dynalink.NamespaceOperation
所有已实现的接口:
Operation

public final class NamespaceOperation extends Object implements Operation
描述对对象的至少一个 Namespace 进行操作的操作。例如,属性 getter 将被描述为
 Operation propertyGetter = new NamespaceOperation(
   StandardOperation.GET,
   StandardNamespace.PROPERTY);
 
它们通常与 NamedOperation 结合使用,例如,为名为“color”的属性表达属性 getter,您将构造:
 Operation colorPropertyGetter = new NamedOperation(
   new NamespaceOperation(
     StandardOperation.GET,
     StandardNamespace.PROPERTY),
   "color");
 

虽然 NamespaceOperation 可以直接构造,但使用 Operation.withNamespace(Namespace) Operation.withNamespaces(Namespace...) 工厂方法通常更方便,例如:

 Operation getElementOrPropertyEmpty =
   StandardOperation.GET
     .withNamespace(StandardNamespace.PROPERTY)
     .named("color");
 

对多个命名空间的操作

如果指定了多个名称空间,则这些名称空间将按优先顺序被视为彼此的替代项。这种操作的语义是“首先适用”。也就是说,GET:PROPERTY|ELEMENT:color 的复合应解释为获取对象上名为“color”的属性,但如果该属性不存在,则获取名为“color”的集合元素.

具有多个命名空间的操作有助于实现不区分一个或多个命名空间的语言,或者在表达针对可被视为普通对象和集合的对象(例如 Java Map 对象)的操作时。针对 Java 映射的 GET:PROPERTY|ELEMENT:empty 操作将始终匹配 Map.isEmpty() 属性,但 GET:ELEMENT|PROPERTY:empty 实际上将匹配具有键 "empty" 的映射元素(如果map包含该键),并且仅在映射不包含键时回退到 isEmpty() 属性获取器。如果源语言要求这种语义,则可以使用对多个命名空间的操作轻松实现。

即使语言本身不区分某些名称空间,将不同的语法映射到不同的名称空间顺序也会很有帮助。例如,源表达式 obj.color 可以映射到 GET:PROPERTY|ELEMENT|METHOD:color ,但是看起来像集合元素访问 obj[key] 的不同源表达式可以表示为 GET:ELEMENT|PROPERTY|METHOD 以支持元素语义。最后,如果检索到的值随后被调用,那么将 METHOD 置于名称空间列表的前面是有意义的:源表达式 obj.color() 的 getter 部分可以是 GET:METHOD|PROPERTY|ELEMENT:colorobj[key]() 的 getter 部分可以是 GET:METHOD|ELEMENT|PROPERTY

命名空间操作的基本操作本身不能是命名空间或命名操作,而是简单操作之一,例如 StandardOperation 的元素。不过,名称空间操作本身可以作为命名操作的基础操作;从上面构造 GET:ELEMENT|PROPERTY:empty 的典型方法是:

 Operation getElementOrPropertyEmpty = StandardOperation.GET
   .withNamespaces(
     StandardNamespace.ELEMENT,
     StandardNamespace.PROPERTY)
   .named("empty");
 
  • 构造方法详细信息

    • NamespaceOperation

      public NamespaceOperation(Operation  baseOperation, Namespace ... namespaces)
      构造一个新的命名空间操作。
      参数:
      baseOperation - 对一个或多个名称空间进行操作的基本操作。
      namespaces - 此操作操作的一个或多个命名空间。
      抛出:
      IllegalArgumentException - 如果指定的命名空间少于一个,或者基本操作本身是 NamespaceOperation NamedOperation
      NullPointerException - 如果 namespaces 数组或其任何元素是 null ,或者如果 baseOperationnull
  • 方法详情

    • getBaseOperation

      public Operation  getBaseOperation()
      返回此命名操作的基本操作。
      返回:
      此命名操作的基本操作。
    • getNamespaces

      public Namespace [] getNamespaces()
      返回此命名空间操作中的命名空间。返回的数组是一个副本,对其的更改不会影响此对象。
      返回:
      此命名空间操作中的命名空间。
    • getNamespaceCount

      public int getNamespaceCount()
      返回此命名空间操作中命名空间的数量。
      返回:
      此命名空间操作中的命名空间数。
    • getNamespace

      public Namespace  getNamespace(int i)
      返回此命名空间操作中的第 i 个命名空间。
      参数:
      i - 命名空间索引
      返回:
      此命名空间操作中的第 i 个命名空间。
      抛出:
      IndexOutOfBoundsException - 如果索引超出范围。
    • contains

      public boolean contains(Namespace  namespace)
      如果此命名空间操作包含等于指定命名空间的命名空间,则返回 true。
      参数:
      namespace - 正在搜索的名称空间。不得为空。
      返回:
      如果此命名空间操作包含等于指定命名空间的命名空间,则为真。
    • equals

      public boolean equals(Object  obj)
      如果另一个对象也是命名空间操作并且它们的基本操作和命名空间相等,则返回 true。
      重写:
      equals 在类 Object
      参数:
      obj - 要比较的对象
      返回:
      如果此对象等于另一个对象,则为 true,否则为 false。
      参见:
    • hashCode

      public int hashCode()
      返回此命名空间操作的哈希码。定义为等于 baseOperation.hashCode() + 31 * Arrays.hashCode(namespaces)
      重写:
      hashCode 在类 Object
      返回:
      此对象的哈希码值。
      参见:
    • toString

      public String  toString()
      返回此命名空间操作的字符串表示形式。定义为它的基本操作的 toString,后跟一个冒号字符,然后是用竖线字符分隔的名称空间列表(例如 "GET:PROPERTY|ELEMENT" )。
      重写:
      toString 在类 Object
      返回:
      此命名空间操作的字符串表示形式。
    • getBaseOperation

      public static Operation  getBaseOperation(Operation  op)
      如果传递的操作是命名空间操作,则返回其 getBaseOperation() ,否则按原样返回操作。
      参数:
      op - 操作
      返回:
      传递操作的基础操作。
    • getNamespaces

      public static Namespace [] getNamespaces(Operation  op)
      如果传递的操作是命名空间操作,则返回其 getNamespaces() ,否则返回一个空数组。
      参数:
      op - 操作
      返回:
      传递的操作的命名空间。
    • contains

      public static boolean contains(Operation  op, Operation  baseOperation, Namespace  namespace)
      如果指定的操作是 NamespaceOperation 并且它的基本操作等于指定的操作,并且它包含指定的命名空间,则返回 true。如果它不是 NamespaceOperation ,则返回 false。
      参数:
      op - 操作。不得为空。
      baseOperation - 正在搜索的基本操作。不得为空。
      namespace - 正在搜索的名称空间。不得为空。
      返回:
      如果传递的操作是 NamespaceOperation ,则为真,其基本操作等于搜索到的基本操作,并且包含一个与搜索到的命名空间相等的命名空间。