这是一个令人困惑的问题,所以我会尽力提出来。
假设我在特定代码块之前和之后有一堆代码。代码块周围的代码始终保持不变,但块内的代码可能会发生变化。为简单起见,请考虑环绕代码是一个双重嵌套for循环:
for(int i = 0; i<width; i++){
for(int i = 0; i<height; i++){
// changing code block
}
}
现在,我想告诉编译器在程序的不同实例中将不同的代码位插入代码块。我该如何做这样的事情?
答案 0 :(得分:5)
如果我理解正确,您必须使用方法声明接口并发送实现具有要实现的逻辑的接口的类的对象引用。基本代码示例:
interface Foo {
public void doFoo(int i, int j);
}
class Bar implements Foo {
@Override
public void doFoo(int i, int j) {
System.out.println(i + j);
}
}
class Baz implements Foo {
@Override
public void doFoo(int i, int j) {
System.out.println(i - j);
}
}
在您当前的代码块中:
public void doXxx(Foo foo) {
//...
for(int i = 0; i<width; i++){
for(int j = 0; j<width; j++){
// changing code block
//solved using interfaces
foo.doFoo(i, j);
}
}
//...
}
现在,您可以使用doXxx
的实施方式致电Foo
,例如Bar
或Baz
的实例:
doXxx(new Bar());
doXxx(new Baz());
答案 1 :(得分:3)
我会使用外部服务来运行所需的代码,并使用IOC(或任何你喜欢的)来为每个实例配置适当的服务。
private MyService myService;
for(int i = 0; i<width; i++){
for(int i = 0; i<width; i++){
myService.myMethod();
}
}
并使用:
public interface MyService {
public void myMethod();
}
public class MySimpleService {
@Override
public void myMethod() {
// Do whatever...
}
}
public class MyOtherService {
@Override
public void myMethod() {
// Do whatever...
}
}
答案 2 :(得分:2)
其他语言可以使用闭包来解决这个问题。对于Java,你需要传递一个类的对象。
例如,您可能有一个名为Looper
的函数,它需要一个参数operation
,您可以使用此操作调用该函数。
要在pre-java 8中执行此操作,您可以做的是编写一个函数,该函数接受一个可调用或等效的对象并执行您的操作。
(可能有一些小错误,原谅我,自从我编写Java代码以来已经有一段时间了,希望这个想法很清楚)
public interface Operation {
public int performOperation(int a, int b);
}
...
public void Looper(Operation o, int a, int b){
for(int i = 0; i<width; i++){
for(int i = 0; i<width; i++){
o.performOperation(a,b);
}
}
}
//elsewhere
Looper(new Operation{
public int performOperation(int a, int b){
return a + b;
}
}, 10,15);
这种模式见于map
,以及函数式语言中的其他类似函数,foreach
以及C ++中的一百万个其他函数。
答案 3 :(得分:0)
您可以在块中添加if condition或switch statement或任何条件语句。
执行单独的代码逻辑。
只是示例:
for(int i = 0; i<width; i++){
for(int i = 0; i<width; i++){
// changing code block
if(codition1){
//Execute block1 logic
}
else if(codition2)
{
//Execute block2 logic
}
}
}
答案 4 :(得分:0)
你正以错误的方式看着这个。如果您只想换掉代码,请创建一个静态方法并调用它:
for(int i = 0; i<width; i++){
for(int i = 0; i<width; i++){
m1();
}
}
for(int i = 0; i<width; i++){
for(int i = 0; i<width; i++){
m2();
}
}
并将方法设为:
static void m1(){
//something
}
static void m2(){
//something else
}
答案 5 :(得分:-1)
将其更改为
for(int i = 0; i<width; i++){
for(int j = 0; j<width; j++){