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

在属性文件中保留方法名称的Java设计模式

巫马望
2023-03-14

我有一个属性文件(键/值)对,从中我当前根据键读取一个值,并在UI中显示该值。

复杂性增加了,现在基于某些公式,该值更具动态性。该公式包含一个变量参数,我将在运行时获取其值。

是否有任何java设计模式来设计此场景。

我想在属性文件中针对一个键放置一个方法名。

现在我将读取键并获取方法名称。此方法将计算该特定键的值。

请告诉我你的建议

共有3个答案

顾超
2023-03-14

使用Java内置JavaScript引擎计算表达式。为了更紧密地匹配这种精神,可以对属性使用JSON。

如果安全性很重要,则需要提供类过滤器。它可能非常简单且限制性很强,因为您只需要计算平凡的表达式。可以在这里找到有关类过滤器的示例。

朱经武
2023-03-14

看起来ANTLR会很适合这里。

它是一个解析器生成器。您将语法作为输入,作为回报,它将为您提供一个解析器。

您可以使用解析器将文本公式转换为已解析的树表示形式。之后,可以运行访问者来评估每个节点。您只需编写一些简单的函数来实现该行为,例如:

public Double visitAdd(AntlrNode left, AntlrNode right) {
    Double left = visit(left);
    Double right = viist(right);

    return left + right;
}

语法非常接近熟悉的BNF表示法。您只需描述您的公式字符串是如何的。例如:

formula : left '+' right;
left: Number;
right: Number;
Number: [0-9]+;
许涵容
2023-03-14

是否有任何java设计模式来设计此场景。

我不知道是否有规律。

如果我正确理解你的问题,我可以解释我通常做什么。

  • 在我的属性值中插入可本地化的字符串
    我通常使用#number#
  • 稍后解决变量时替换它

小例子:

信息。属性

name.of.key = sum of #0# + #1# = #2#

然后,我从中读取值,并用适当的值替换数值(注意:这里对shortenes使用相同的方法,但我使用外部替换方法):

public void printSum(int n1, int n2) {
    String myString = messageSource("name.of.key", Locale.getDefault(), null, null));
    myString.replace("#0#", String.valueOf(n1));
    myString.replace("#1#", String.valueOf(n2));
    myString.replace("#2#", String.valueOf(n1+n2));
    System.out.println(myString);
}

OUTPUTprintSum(1,2);

sum of 1 + 2 = 3
 类似资料:
  • 为了便于编程,CodeIgniter 使用了一些函数、方法、类 和 变量名来实现。 因此,这些名称不能被开发者所使用,下面是不能使用的保留名称列表。 控制器名称 因为你的控制器类将继承主程序控制器,所以你的方法命名一定不能和 主程序控制器类中的方法名相同,否则你的方法将会覆盖他们。 下面列出了已经保留的名称,请不要将你的控制器命名为这些: CI_Controller Default index 函

  • 下面的这些名称不能在非方括号语法中被用作顶层变量 (比如 .vars["in"]),因为这是FTL中的关键字: true:布尔值"true" false:布尔值"false" gt:比较运算符"大于" gte:比较运算符"大于或等于" lt:比较运算符"小于" lte:比较运算符"小于或等于" as:由少数指令使用 in:由少数指令使用 using:由少数指令使用

  • 这可能是更多的设计选择,我想“为什么要重新发明轮子”。有人可能已经需要这个了。 (我不想使用任何第三方框架,因为我的框架是一个小项目。我已经在使用Adam Bein的)。我正在JavaFX中实现一个独立的应用程序。我对MVC/MVP/MVVM非常感兴趣。由于javafx允许我使用fxml分离UI,所以我通过fxml实现了大部分UI设计。但在那里我遇到了一些问题。 tradeview.fxml(我所

  • 问题内容: 我正在使用proguard混淆我的android应用程序。android应用程序包含一些本机代码,这些代码使回调到完全限定的java方法。我不必混淆这些类及其方法的名称。下面正确地保留了类名,但没有保留方法名。 问题答案: 对于本机方法:ProGuard手册>示例>处理本机方法 在这种情况下,对于回调方法:ProGuard手册>示例>处理回调方法 或者,例如,如果所有公共方法都可能是回

  • 问题内容: 保留字可以用作对象的属性名称吗? 先前的堆栈溢出问题(浏览器支持在JavaScript中使用保留字作为属性名称)间接引发了此问题。答案似乎是AlexWayne的普遍共识: 您可以使用这些单词,但只能将其用作字符串,而不能用作速记属性。 虽然我认为他们在这方面可能比我了解更多,并且在某些情况下使用保留字可能不是一个 好主意 ,但基于两点,我认为他们的结论是错误的: 使用保留字作为“速记”

  • 我需要使用属性名称替换xml文件中的属性值。 前任: 我有一个替换此值的目标。i、 e“默认值”。如果用户为属性测试名称指定了错误的值,则可以多次运行此目标。用户可以使用正确的值重试运行目标。因此,我不能使用正则表达式替换。我只能依靠物业名称。有没有一种方法可以在ant中使用属性值的名称来替换属性值?