枚举 shorthand 调用 - 静态导入

Enums shorthand calls - static imports

我对枚举的导入语句有点困惑。考虑以下代码段:

UsernamePasswordAuthenticationFilter getUsernamePasswordAuthenticationFilter() {

    UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter =
            new UsernamePasswordAuthenticationFilter();
    usernamePasswordAuthenticationFilter.setAllowSessionCreation(false);
    usernamePasswordAuthenticationFilter.setUsernameParameter(SecurityConstants.CREDENTIALS_USERNAME.getText());
    usernamePasswordAuthenticationFilter.setPasswordParameter(SecurityConstants.CREDENTIALS_PASSWORD.getText());

这个特殊的符号太长:

SecurityConstants.CREDENTIALS_PASSWORD.getText()

证明在这种情况下一起使用 enum 是合理的。是否可以像 CREDENTIALS_PASSWORD.getText() 那样引用枚举?

我不知道为什么我有这种可能的感觉,也许 JUnit assert 语句静态导入反映在我的大脑中,因为您可以使用静态导入做一些简短的事情assertEquals()

有没有办法对枚举做类似的事情?

枚举class本身:

public enum SecurityConstants {
    CREDENTIALS_PROCESSING_URL("app/authenticate"),
    CREDENTIALS_USERNAME("username"),
    CREDENTIALS_PASSWORD("password");

    private String text;

    SecurityConstants(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

只需导入枚举,然后直接调用枚举实例。另外,如果您使枚举实例名称与您想要的文本相同 - 无需调用 getText()。

顺便说一句,您必须使用静态导入。

是的,有可能。

import static SecurityConstants.*

JLS 供参考。 7.5.4. Static-Import-on-Demand Declarations

A static-import-on-demand declaration allows all accessible static members of a named type to be imported as needed.

StaticImportOnDemandDeclaration:
     import static TypeName . * ;

The TypeName must be the canonical name (§6.7) of a class type, interface type, enum type, or annotation type.