Module java.naming
Package javax.naming

Class CompoundName

java.lang.Object
javax.naming.CompoundName
所有已实现的接口:
Serializable, Cloneable, Comparable<Object>, Name

public class CompoundName extends Object implements Name
该类表示复合名称 -- 来自分层名称空间的名称。复合名称中的每个组件都是原子名称。

复合名称的组件是按顺序编号的。具有 N 个组件的复合名称的索引范围从 0 到 N,但不包括 N。这个范围可以写成 [0,N)。最重要的组件位于索引 0。空的复合名称没有组件。

复合名称语法

复合名称的语法使用一组属性来指定:
jndi.syntax.direction
解析方向("right_to_left","left_to_right","flat")。如果未指定,默认为 "flat",表示命名空间是平的,没有分层结构。
jndi.syntax.separator
原子名称组件之间的分隔符。除非方向为 "flat",否则必需。
jndi.syntax.ignorecase
如果存在,"true" 表示在比较名称组件时忽略大小写。如果其值不是 "true",或者属性不存在,则在比较名称组件时考虑大小写。
jndi.syntax.escape
如果存在,指定用于覆盖分隔符、转义和引号的转义字符串。
jndi.syntax.beginquote
如果存在,指定引号字符串的起始定界符。
jndi.syntax.endquote
引号字符串的结束定界符。如果存在,指定引号字符串的结束定界符。如果不存在,则使用 syntax.beginquote 作为结束引号。
jndi.syntax.beginquote2
替代的起始/结束引号集。
jndi.syntax.endquote2
替代的起始/结束引号集。
jndi.syntax.trimblanks
如果存在,"true" 表示在比较名称组件时修剪任何前导和尾随空格。如果其值不是 "true",或者属性不存在,则空格是有意义的。
jndi.syntax.separator.ava
如果存在,指定在指定多个属性/值对时分隔属性-值断言的字符串。(例如,在 age=65,gender=male 中为 ",")。
jndi.syntax.separator.typeval
如果存在,指定属性与值之间的分隔符(例如,在 "age=65" 中为 "=")。
这些属性根据以下规则进行解释:
  1. 在没有引号或转义的字符串中,分隔符的任何实例都将两个原子名称分隔开。每个原子名称称为一个 组件
  2. 如果分隔符、引号或转义符紧跟在转义符之后(在左侧),则它们将被转义。
  3. 如果有两组引号,必须匹配特定的起始引号和相应的结束引号。
  4. 在组件前面的非转义起始引号必须与组件末尾的非转义结束引号匹配。因此,引用的组件被称为 引用组件。它通过删除起始和结束引号,并将中间字符视为普通字符来解析。
  5. 嵌入在非引用组件中的引号被视为普通字符串,无需匹配。
  6. 转义或出现在非转义引号之间的分隔符被视为普通字符串,而不是分隔符。
  7. 在引用组件中的转义字符串仅在后面跟随相应的结束引号字符串时才起作用。这可用于在引用组件中嵌入转义引号。
  8. 转义的转义字符串不被视为转义字符串。
  9. 不在元字符串(引号或分隔符)之前且不在组件末尾的转义字符串被视为普通字符串。
  10. 前导分隔符(复合名称字符串以分隔符开头)表示前导空原子组件(由空字符串组成)。尾随分隔符(复合名称字符串以分隔符结尾)表示尾随空原子组件。相邻的分隔符表示空原子组件。

复合名称的字符串形式遵循上述描述的语法。当复合名称的组件转换为它们的字符串表示时,将应用上述保留的语法规则(例如,嵌入的分隔符将被转义或引用),以便在解析相同字符串时,将产生原始复合名称的相同组件。

多线程访问

CompoundName 实例不会针对并发多线程访问进行同步。试图访问和修改 CompoundName 的多个线程应锁定该对象。
自 JDK 版本:
1.3
参见:
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected Properties
    该复合名称的语法属性。
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
     
    通过使用提供的语法属性解析字符串 n 来构造新的复合名称实例。
    protected
    使用 comps 和 syntax 指定的组件构造新的复合名称实例。
  • Method Summary

    Modifier and Type
    Method
    Description
    add(int posn, String comp)
    在此复合名称中的指定位置添加单个组件。
    add(String comp)
    在此复合名称末尾添加单个组件。
    addAll(int posn, Name n)
    在此复合名称的指定位置按顺序添加复合名称的组件。
    addAll(Name suffix)
    按顺序将复合名称的组件添加到此复合名称的末尾。
    clone()
    创建此复合名称的副本。
    int
    将此 CompoundName 与指定的 Object 进行比较以确定顺序。
    boolean
    确定复合名称是否为此复合名称的后缀。
    boolean
    equals(Object obj)
    确定 obj 是否在语法上等于此复合名称。
    get(int posn)
    检索此复合名称的组件。
    getAll()
    将此复合名称的组件作为字符串枚举检索。
    getPrefix(int posn)
    创建一个复合名称,其组件由此复合名称中的组件前缀组成。
    getSuffix(int posn)
    创建一个复合名称,其组件由此复合名称中的组件后缀组成。
    int
    计算此复合名称的哈希码。
    boolean
    确定此复合名称是否为空。
    remove(int posn)
    从此复合名称中删除一个组件。
    int
    size()
    检索此复合名称中的组件数。
    boolean
    确定复合名称是否为此复合名称的前缀。
    生成此复合名称的字符串表示,使用复合名称的语法规则。

    Methods declared in class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Field Details

    • mySyntax

      protected transient Properties mySyntax
      该复合名称的语法属性。此字段由构造函数初始化,不能为 null。子类应将 mySyntax 视为只读变量。任何必要更改应在构造函数内部进行,而不是在实例化复合名称后进行。
  • Constructor Details

    • CompoundName

      protected CompoundName(Enumeration<String> comps, Properties syntax)
      使用 comps 和 syntax 指定的组件构造新的复合名称实例。此受保护方法旨在由 CompoundName 的子类在覆盖方法(如 clone()、getPrefix()、getSuffix())时使用。
      参数:
      comps - 要添加的组件的非空枚举。枚举的每个元素都是 String 类。将使用该枚举来提取其元素。
      syntax - 指定此复合名称的语法的非空属性。有关属性内容,请参阅类描述。
    • CompoundName

      public CompoundName(String n, Properties syntax) throws InvalidNameException
      通过使用提供的语法属性解析字符串 n 来构造新的复合名称实例。
      参数:
      n - 要解析的非空字符串。
      syntax - 指定此复合名称的语法的非空属性列表。有关属性内容,请参阅类描述。
      抛出:
      InvalidNameException - 如果 'n' 违反了由 syntax 指定的语法。
  • Method Details

    • toString

      public String toString()
      生成此复合名称的字符串表示,使用复合名称的语法规则。在类描述中描述了语法规则。空组件由空字符串表示。因此生成的字符串表示可以传递给具有相同语法属性的 CompoundName 构造函数,以创建一个新的等效复合名称。
      覆盖:
      toString 在类 Object
      返回:
      此复合名称的非空字符串表示。
    • equals

      public boolean equals(Object obj)
      确定 obj 是否在语法上等于此复合名称。如果 obj 为 null 或不是 CompoundName,则返回 false。如果一个复合名称中的每个组件与另一个复合名称中的相应组件是 "相等" 的,则两个复合名称相等。

      相等性还根据此复合名称的语法来定义。CompoundName 的默认实现在比较两个组件是否相等时使用 jndi.syntax.ignorecase 和 jndi.syntax.trimblanks 语法属性。如果忽略大小写,则具有相同字符序列但大小写不同的两个字符串被视为相等。如果修剪空格,则在比较时会忽略前导和尾随空格。

      两个复合名称必须具有相同数量的组件。

      实现注意事项:目前,两个复合名称的语法属性不会进行相等性比较。将来可能会进行比较。

      覆盖:
      equals 在类 Object
      参数:
      obj - 要与之比较的可能为null的对象。
      返回:
      如果obj等于此复合名称,则返回true,否则返回false。
      参见:
    • hashCode

      public int hashCode()
      计算此复合名称的哈希码。哈希码是此复合名称各个组件的“规范化”形式的哈希码之和。在计算其哈希码之前,每个组件都根据复合名称的语法进行“规范化”。例如,对于不区分大小写的名称,名称的大写形式与其小写等效形式具有相同的哈希码。
      覆盖:
      hashCode 在类 Object
      返回:
      表示此名称的哈希码的int值。
      参见:
    • clone

      public Object clone()
      创建此复合名称的副本。对此复合名称的组件进行的更改不会影响新副本,反之亦然。克隆和此复合名称共享相同的语法。
      指定者:
      clone 在接口 Name
      覆盖:
      clone 在类 Object
      返回:
      此复合名称的非null副本。
      参见:
    • compareTo

      public int compareTo(Object obj)
      将此CompoundName与指定的Object进行比较以确定顺序。如果此名称小于、等于或大于给定的Object,则返回负整数、零或正整数。

      如果obj为null或不是CompoundName的实例,则抛出ClassCastException。

      有关两个复合名称相等的含义,请参见equals()。如果两个复合名称相等,则返回0。

      复合名称的排序取决于复合名称的语法。默认情况下,它们遵循字符串比较的词法规则,其中包括所有复合名称中的所有组件,并且单个组件的比较受jndi.syntax.ignorecase和jndi.syntax.trimblanks属性的影响,与它们如何影响equals()相同。如果此复合名称在“词法上”小于obj,则返回负数。如果此复合名称在“词法上”大于obj,则返回正数。

      实现注意事项:当前在检查顺序时未比较两个复合名称的语法属性。将来可能会比较。

      指定者:
      compareTo 在接口 Comparable<Object>
      指定者:
      compareTo 在接口 Name
      参数:
      obj - 要与之比较的非null对象。
      返回:
      作为此名称小于、等于或大于给定对象的负整数、零或正整数。
      抛出:
      ClassCastException - 如果obj不是CompoundName。
      参见:
    • size

      public int size()
      检索此复合名称中的组件数。
      指定者:
      size 在接口 Name
      返回:
      此复合名称中组件的非负数。
    • isEmpty

      public boolean isEmpty()
      确定此复合名称是否为空。如果复合名称具有零个组件,则为空。
      指定者:
      isEmpty 在接口 Name
      返回:
      如果此复合名称为空,则返回true,否则返回false。
    • getAll

      public Enumeration<String> getAll()
      将此复合名称的组件作为字符串枚举检索。对此复合名称进行的更新对此枚举的影响是未定义的。
      指定者:
      getAll 在接口 Name
      返回:
      此复合名称组件的非null枚举。枚举的每个元素都是String类。
    • get

      public String get(int posn)
      检索此复合名称的组件。
      指定者:
      get 在接口 Name
      参数:
      posn - 要检索的组件的基于0的索引。必须在范围[0,size())内。
      返回:
      索引为posn的组件。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围。
    • getPrefix

      public Name getPrefix(int posn)
      创建一个由此复合名称中组件的前缀组成的复合名称。结果和此复合名称共享相同的语法。对此复合名称的后续更改不会影响返回的名称,反之亦然。
      指定者:
      getPrefix 在接口 Name
      参数:
      posn - 要停止的组件的基于0的索引。必须在范围[0,size()]内。
      返回:
      由索引范围[0,posn)中的组件组成的复合名称。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围。
    • getSuffix

      public Name getSuffix(int posn)
      创建一个由此复合名称中组件的后缀组成的复合名称。结果和此复合名称共享相同的语法。对此复合名称的后续更改不会影响返回的名称。
      指定者:
      getSuffix 在接口 Name
      参数:
      posn - 要开始的组件的基于0的索引。必须在范围[0,size()]内。
      返回:
      由索引范围[posn,size())中的组件组成的复合名称。如果posn等于size(),则返回一个空的复合名称。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围。
    • startsWith

      public boolean startsWith(Name n)
      确定一个复合名称是否是此复合名称的前缀。如果复合名称'n'等于getPrefix(n.size()),换句话说,此复合名称以'n'开头,则'n'是前缀。如果n为null或不是复合名称,则返回false。

      实现注意事项:当前在进行比较时未使用n的语法属性。将来可能会比较。

      指定者:
      startsWith 在接口 Name
      参数:
      n - 要检查的可能为null的复合名称。
      返回:
      如果n是CompoundName并且是此复合名称的前缀,则返回true,否则返回false。
    • endsWith

      public boolean endsWith(Name n)
      确定一个复合名称是否是此复合名称的后缀。如果复合名称'n'等于getSuffix(size()-n.size()),换句话说,此复合名称以'n'结尾,则'n'是后缀。如果n为null或不是复合名称,则返回false。

      实现注意事项:当前在进行比较时未使用n的语法属性。将来可能会比较。

      指定者:
      endsWith 在接口 Name
      参数:
      n - 要检查的可能为null的复合名称。
      返回:
      如果n是CompoundName并且是此复合名称的后缀,则返回true,否则返回false。
    • addAll

      public Name addAll(Name suffix) throws InvalidNameException
      将复合名称的组件按顺序添加到此复合名称的末尾。

      实现注意事项:当前未使用或检查后缀的语法属性。将来可能会使用。

      指定者:
      addAll 在接口 Name中指定
      参数:
      suffix - 要添加的非空组件。
      返回值:
      更新后的CompoundName,而不是新的。不能为null。
      抛出:
      InvalidNameException - 如果suffix不是复合名称,或者如果添加组件违反了此复合名称的语法(例如超过组件数量)。
    • addAll

      public Name addAll(int posn, Name n) throws InvalidNameException
      在指定位置向此复合名称中按顺序添加复合名称的组件。此复合名称中第一个新组件的索引位置及之后的组件将向上移动(远离索引0)以容纳新组件。

      实现注意事项:目前未使用或检查suffix的语法属性。将来可能会使用。

      指定者:
      addAll 在接口 Name中指定
      参数:
      posn - 要添加新组件的此名称中的索引。必须在范围[0,size()]内。
      n - 要添加的非空组件。
      返回值:
      更新后的CompoundName,而不是新的。不能为null。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围。
      InvalidNameException - 如果n不是复合名称,或者如果添加组件违反了此复合名称的语法(例如超过组件数量)。
    • add

      public Name add(String comp) throws InvalidNameException
      在此复合名称的末尾添加单个组件。
      指定者:
      add 在接口 Name中指定
      参数:
      comp - 要添加的非空组件。
      返回值:
      更新后的CompoundName,而不是新的。不能为null。
      抛出:
      InvalidNameException - 如果在名称末尾添加comp会违反复合名称的语法。
    • add

      public Name add(int posn, String comp) throws InvalidNameException
      在此复合名称中的指定位置添加单个组件。此复合名称中新组件的索引位置及之后的组件将向上移动一个位置(远离索引0)以容纳新组件。
      指定者:
      add 在接口 Name中指定
      参数:
      posn - 要添加新组件的索引位置。必须在范围[0,size()]内。
      comp - 要添加的非空组件。
      返回值:
      更新后的CompoundName,而不是新的。不能为null。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围。
      InvalidNameException - 如果在指定位置添加comp会违反复合名称的语法。
    • remove

      public Object remove(int posn) throws InvalidNameException
      从此复合名称中删除一个组件。删除此复合名称中位置为'posn'的组件,并将索引大于'posn'的组件向下移动一个位置(朝向索引0)。
      指定者:
      remove 在接口 Name中指定
      参数:
      posn - 要删除的组件的索引。必须在范围[0,size())内。
      返回值:
      已删除的组件(一个字符串)。
      抛出:
      ArrayIndexOutOfBoundsException - 如果posn超出指定范围(包括复合名称为空的情况)。
      InvalidNameException - 如果删除组件会违反复合名称的语法。