Module jdk.dynalink
Package jdk.dynalink

Class 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"的映射元素,如果映射包含该键,则仅回退到isEmpty()属性getter,如果映射不包含该键。如果源语言规定了这种语义,可以很容易地通过多个命名空间上的操作来实现。

即使语言本身不区分某些命名空间,将不同的语法映射到不同的命名空间顺序也可能有所帮助。例如,源表达式obj.color可以映射到GET:PROPERTY|ELEMENT|METHOD:color,但类似于集合元素访问的不同源表达式obj[key]可以表示为GET:ELEMENT|PROPERTY|METHOD,以便优先考虑元素语义。最后,如果检索到的值随后被调用,则将METHOD带到命名空间列表的前面是有意义的:源表达式obj.color()的getter部分可以是GET:METHOD|PROPERTY|ELEMENT:color,而obj[key]()的getter部分可以是GET:METHOD|ELEMENT|PROPERTY

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

 Operation getElementOrPropertyEmpty = StandardOperation.GET
     .withNamespaces(
         StandardNamespace.ELEMENT,
         StandardNamespace.PROPERTY)
     .named("empty");
 
  • Constructor Details

    • NamespaceOperation

      public NamespaceOperation(Operation baseOperation, Namespace... namespaces)
      构造一个新的命名空间操作。
      参数:
      baseOperation - 操作在一个或多个命名空间上操作。
      namespaces - 此操作操作的一个或多个命名空间。
      抛出:
      IllegalArgumentException - 如果指定少于一个命名空间,或基本操作本身是NamespaceOperationNamedOperation
      NullPointerException - 如果namespaces数组或其任何元素为null,或者baseOperationnull
  • Method Details

    • 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 - 要搜索的命名空间。不得为null。
      返回:
      如果此命名空间操作包含与指定命名空间相等的命名空间,则返回true。
    • 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 - 操作。不得为null。
      baseOperation - 正在搜索的基本操作。不得为null。
      namespace - 正在搜索的命名空间。不得为null。
      返回:
      如果传递的操作是一个NamespaceOperation,其基本操作等于搜索的基本操作,并且包含等于搜索的命名空间的命名空间,则返回true。