- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
标题很容易被误解,但归结为我很可能需要一个 design-pattern来消除冗余代码。为了让我的问题尽可能清楚,我做了一个代码示例,而不是写一个模糊的解释。
基本上,我有以下功能:getValue1()
, getValue2()
, getValue3()
, ...
, getValue12()
这些函数可能如下所示(尽管它们彼此之间略有不同,并且不能通过使它们实现策略模式的接口(interface)来编辑):
public int getValue1()
{
return 1 + 2;
}
接下来我们有一个辅助类 myClass
,它需要 getValue() 函数返回的值。 myClass
中的函数将如下所示(每个函数的不同之处在于它们使用了不同的 getValue() 函数):
public int getMyValues1()
{
int[] values = new int[10];
for (int i = 0; i < 10; i++) {
int[i] = getValue1() // NOTE: getValueX() may output differently each time.
}
}
我们已经解决了我们的问题。
如果我们要为每个相应的 getValues() 创建一个 getMyValues() 函数,我们将不得不多次复制并粘贴相同的代码。
这违背了 OOP 语言所代表的一切——这就是为什么我需要你的帮助。
非常感谢任何建议!
编辑:
我重新打开了问题,因为我要使用的 IDE 不支持 Java 8。
基本上我有以下设置:
getValueClass
getValue1()
getValue2()
etc.
myClass
getMyValues1()
getMyValues2()
etc.
implemetingClass
private myClass mc = new MyClass()
main()
getLowestValue(int[] values)
因此 main() 可能如下所示 - 如果我希望输出最低值:
public static void main(String[] args)
{
...
System.out.print(getLowestValue(mc.getMyValues1()));
...
}
此编辑表明策略模式不可行,因为我在一个类中有我的函数。
希望这能消除任何困惑,我真的希望你们能帮我解决这个问题!
最佳答案
假设这些方法是公共(public)的,那么在 Java 8 中,您应该能够使用函数式接口(interface)(在这个简单的示例中它是 java.util.function.IntSupplier
)并将对这些方法的引用作为 lambda 表达式传递。
类似的东西(未测试编译):
public int[] getMyValues(IntSupplier supplier) {
int[] values = new int[10];
for (int i = 0; i < 10; i++) {
int[i] = supplier.getAsInt()
}
return values;
}
调用方式:
int[] values = someobject.getMyValues(someobject::getValues1)
这或多或少地将这些方法用作策略,而不需要制作实际的接口(interface)和多个实现:策略接口(interface)本身就是功能接口(interface),方法引用生成实现。
编辑:如果您不能使用 Java 8,那么您可以仅使用 1 个返回 int
的方法来定义您自己的接口(interface)。由于缺乏对方法引用的支持,调用变得更长:
int[] values = someobject.getMyValues(new MyIntProducer() {
public int getValue() { return someobject.getValues1(); };
}
请注意,someobject
局部变量需要设置为 final 才能工作。
关于java - 在不使用上下文接口(interface)的情况下决定在运行时调用什么方法(没有 Java8 特性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331153/
我是一名优秀的程序员,十分优秀!