当前位置: 首页 > 知识库问答 >
问题:

如何动态调用静态嵌套类?

慕容俭
2023-03-14

我有以下java代码:

...

public final class Constants {

    ...

    public static class Languages {
        ...
        
        public static class en_US {
            public static final String VALIDATION_REGEX = "[a-zA-Z-' ]+";
            ...
        }
        public static class en_GB {
            public static final String VALIDATION_REGEX = "[a-zA-Z-' ]+";
            ...
        }
    }

    ...
}

我的问题如下:我收到一个文本和一种语言,我必须检查该文本是否仅使用该语言的有效字母字符书写。我的代码如下:

...

public boolean isContentValid(String content, String language) {
    Boolean isCorrect = false;
    switch (language) {
        ...
        
        case "en_US":
            isCorrect = content.matches(Constants.Phrases.en_US.VALIDATION_REGEX);
            break;
        case "en_GB":
            isCorrect = content.matches(Constants.Phrases.en_GB.VALIDATION_REGEX);
            break;

        ...
        
        default:
            isCorrect = false;
    }
    return isCorrect;
}

...

这很好,也很有效,但随着我在应用程序中添加语言,我将不得不在交换机中添加越来越多的案例。

我想知道在Java中是否有一种方法可以动态命名一个静态嵌套类,比如:

Constants.Phrases[language].VALIDATION_REGEX

所以我上面的代码可能是这样的:

...

public boolean isContentValid(String content, String language) {
    return content.matches(Constants.Phrases[language].VALIDATION_REGEX);
}

...

谢谢,如果这是超级简单的事情,我很抱歉。

我是一名JavaScript开发人员,正在学习Java

共有1个答案

苏淇
2023-03-14

您可以使用enum来执行类似的操作。

“枚举可以像类一样具有属性和方法。唯一的区别是枚举常量是公共的、静态的和最终的(不可更改-无法重写)。”[w3][1]

public enum Languages {
    EN_US {
        @Override
        public String toString() {
            return "[a-zA-Z-' ]+";
        }
    },
    EN_GB {
        @Override
        public String toString() {
            return "[a-zA-Z-' ]+";
        }
    },
}

然后你可以像这样访问这些值

Languages.valueOf("EN_US");

正如@Pshemo所提到的,如果想要更轻量级的东西,可以完全避免基于类的方法,并使用Map的实现

[1]:https://www.w3schools.com/java/java_enums.asp#:~: text=一个枚举可以,就像,但它可以实现接口)。

 类似资料:
  • 如何验证是否调用了私有嵌套类的非静态方法?这就是我目前的情况: 我明白了: 更新1: @丹尼斯,我试过以下方法,不过我得到了一个。我想根据JVM中已经存在的单例验证方法的运行,而不是创建它的新实例(正如我在下面的代码中所做的那样),以便调用方法。我尝试调用,但没有成功。有没有一种方法可以使用外部类的运行实例上的反射来验证jmockit中对私有嵌套类中非静态方法的调用(通过调用)? 更新2: 尝试获

  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 问题内容: 我很难用Java的非静态嵌套类来解决问题。考虑以下示例,该示例先显示“ Inner”,然后显示“ Child”。 我知道Inner实例始终必须与Outer实例相关联,这也适用于Child,因为它扩展了Inner。我的问题是语法的含义- 为什么调用内部构造函数? 我只看到一个用于调用超类构造函数和调用重写方法的超类版本的纯文本,但从未使用过这种形式。 问题答案: 这称为“合格的超类构造函

  • 我正在用Java建模,并使用构建器模式。在许多情况下,一些共同成员是在父级中定义的,而其他成员则是在从父级继承的子级上定义的。一个例子如下: 如果删除,则在上得到相同的错误。看来我对静态嵌套类的继承有一个根本的误解。 为什么当返回时,编译器会抱怨方法不在中?有没有一种方法可以像我所尝试的那样,利用继承和这个构建器模式,允许在父级中定义公共成员,在子级中定义其他成员?

  • 这个类有三个方法执行相同的操作,它们等待页面加载三秒钟,如果页面加载,则返回true。 我的问题是,我如何决定哪段代码是最好的? 我知道Lambda比Anon类更好,但为什么静态嵌套类(pageLoaded3)不好呢?根据这篇文章,它也应该是合适的。 这是三个方法返回类型的接口: