Module jdk.jshell
Package jdk.jshell

Enum Class Snippet.Status

java.lang.Object
java.lang.Enum<Snippet.Status>
jdk.jshell.Snippet.Status
所有已实现的接口:
Serializable, Comparable<Snippet.Status>, Constable
封装类:
Snippet

public static enum Snippet.Status extends Enum<Snippet.Status>
描述了代码片段的当前状态。这是JShell状态中代码片段的动态属性 -- 因此可以通过对 JShell 的查询来检索。

Status 随着状态的改变而改变。例如,使用 eval 创建另一个代码片段可能会解析此代码片段的依赖项(或使这些依赖项无效),或者 覆盖 此代码片段从而改变其 Status

Status 相关的重要属性有: isDefined(),如果它对其他现有和新的代码片段可见; 以及 isActive(),如果随着JShell状态的改变,代码片段将更新,可能会改变 Status。只有处于 VALID Status 的可执行代码片段才能被执行。

参见:
  • Enum Constant Details

    • VALID

      public static final Snippet.Status VALID
      代码片段是一个有效的代码片段(在当前 JShell 状态下)。只有具有 VALID Status 的代码片段才能被执行(尽管并非所有 VALID 代码片段都具有可执行代码)。

      代码片段已定义(isDefined() == true)。如果代码片段是声明或导入(Snippet.Kind.isPersistent()),它对其他代码片段可见

      代码片段将随着依赖项的更改而更新(isActive() == true),其状态可能变为 RECOVERABLE_DEFINEDRECOVERABLE_NOT_DEFINEDDROPPEDOVERWRITTEN

    • RECOVERABLE_DEFINED

      public static final Snippet.Status RECOVERABLE_DEFINED
      代码片段是一个声明代码片段,其主体中可能存在可恢复的未解决引用或其他问题(在当前 JShell 状态下)。只有 DeclarationSnippet 可以具有此 Status

      代码片段具有有效的签名,对其他代码片段可见(isDefined() == true),因此可以在现有或新代码片段中引用该代码片段,但无法执行该代码片段。在尝试执行时,将抛出 UnresolvedReferenceException

      代码片段将随着依赖项的更改而更新(isActive() == true),其状态可能变为 VALIDRECOVERABLE_NOT_DEFINEDDROPPEDOVERWRITTEN

      注意: RECOVERABLE_DEFINEDRECOVERABLE_NOT_DEFINED 都表示可能可恢复的错误,它们的区别在于对于 RECOVERABLE_DEFINED,代码片段是 已定义 的。

    • RECOVERABLE_NOT_DEFINED

      public static final Snippet.Status RECOVERABLE_NOT_DEFINED
      代码片段是一个声明代码片段,其主体中可能存在可恢复的未解决引用或其他问题(在当前 JShell 状态下)。只有 DeclarationSnippet 可以具有此 Status

      代码片段具有无效的签名或实现无法定义它。该代码片段对其他代码片段不可见(isDefined() == false),因此无法引用或执行。

      代码片段将随着依赖项的更改而更新(isActive() == true),其状态可能变为 VALIDRECOVERABLE_DEFINEDDROPPEDOVERWRITTEN

      注意: RECOVERABLE_DEFINEDRECOVERABLE_NOT_DEFINED 都表示可能可恢复的错误,它们的区别在于对于 RECOVERABLE_DEFINED,代码片段是 已定义 的。

    • DROPPED

      public static final Snippet.Status DROPPED
      由于显式调用 JShell.drop(Snippet),代码片段处于非活动状态。

      代码片段对其他代码片段不可见(isDefined() == false),因此无法引用或执行。

      代码片段将不会随着依赖项的更改而更新(isActive() == false),其 Status 将永远不会再次改变。

    • OVERWRITTEN

      public static final Snippet.Status OVERWRITTEN
      由于已被新代码片段替换,因此代码片段处于非活动状态。当使用 eval 添加的新代码片段与先前的代码片段匹配时会发生这种情况。如果 TypeDeclSnippet 与另一个 TypeDeclSnippet 匹配,则名称匹配。例如 class X { } 将覆盖 class X { int ii; }interface X { }。如果 MethodSnippet 与另一个 MethodSnippet 的名称和参数类型匹配,则匹配。例如 void m(int a) { } 将覆盖 int m(int a) { return a+a; }。如果 VarSnippet 与另一个 VarSnippet 的名称匹配,则匹配。例如 double z; 将覆盖 long z = 2L;。只有 PersistentSnippet 可以具有此 Status

      代码片段对其他代码片段不可见(isDefined() == false),因此无法引用或执行。

      代码片段将不会随着依赖项的更改而更新(isActive() == false),其 Status 将永远不会再次改变。

    • REJECTED

      public static final Snippet.Status REJECTED
      由于在初始评估时编译失败且无法通过对JShell状态的进一步更改而变为有效,因此代码片段处于非活动状态。

      代码片段对其他代码片段不可见(isDefined() == false),因此无法引用或执行。

      代码片段将不会随着依赖项的更改而更新(isActive() == false),其 Status 将永远不会再次改变。

    • NONEXISTENT

      public static final Snippet.Status NONEXISTENT
      由于代码片段尚不存在,因此代码片段处于非活动状态。仅在新代码片段的 SnippetEvent.previousStatus 中使用。 JShell.status(Snippet) 永远不会返回此 Status

      空洞地,isDefined()isActive() 都定义为 false

  • Method Details

    • values

      public static Snippet.Status[] values()
      返回按声明顺序包含此枚举类的常量的数组。
      返回:
      包含此枚举类的常量的数组,按声明顺序排列
    • valueOf

      public static Snippet.Status valueOf(String name)
      返回具有指定名称的此类的枚举常量。字符串必须与用于在此类中声明枚举常量的标识符完全匹配。(不允许存在多余的空格字符。)
      参数:
      name - 要返回的枚举常量的名称。
      返回:
      具有指定名称的枚举常量
      抛出:
      IllegalArgumentException - 如果此枚举类没有具有指定名称的常量
      NullPointerException - 如果参数为 null
    • isActive

      public boolean isActive()
      指示代码片段是否活动,即当调用可能改变其状态的新 JShell.eval(String)JShell.drop(Snippet) 时,是否会重新评估 持久 代码片段。这比 isDefined() 更广泛,因为一个 RECOVERABLE_NOT_DEFINED 的代码片段将被更新。
      返回:
      如果代码片段活动,则返回 true;否则返回 false
    • isDefined

      public boolean isDefined()
      指示代码片段当前是否属于JShell的已定义状态。它是否对其他代码片段的编译可见?
      返回:
      如果代码片段已定义,则返回 true;否则返回 false