2012-04-08 28 views
0

在Java中,如何获得一个Runnable类,该类根据其构造函数选择其函数?取决于构造函数的可运行函数

例如:

Class A implements Runnable { 

    public A(int var) { 
     //things go here 
    } 

    public A(int var1, String var2) { 
     //things go here 
    } 

    public void run() { 
     //do (a) if Constructor A(int var) 
     //do (b) if Constructor A(int var1, String var2) 
    } 
} 

回答

3

我会设置一个Strategy模式:

class A implements Runnable { 

    private final ExecutionStrategy strategy; 

    public A(int var) { 
     strategy = new FooStrategy(); 
    } 

    public A(int var1, String var2) { 
     strategy = new BarStrategy(); 
    } 

    public void run() { 
     strategy.exec(); 
    } 

    interface ExecutionStrategy { 
     public void exec(); 
    } 

    private class FooStrategy implements ExecutionStrategy { 
     @Override 
     public void exec() { 
     //implement me 
     } 
    } 

    private class BarStrategy implements ExecutionStrategy { 
     @Override 
     public void exec() { 
     //implement me 
     } 
    } 
} 
+0

除了我会保持简单的原因之外,我还会提出很多相同的建议:为什么不定义匿名Runnable,以便始终坚持Runnable接口?不需要引入更多的“类型”来跟踪头部的内容......(请记住这是关于近似函数。) – user268396 2012-04-08 00:54:20

+1

我想这是一个味道问题。我认为添加新类型实际上可以降低代码的复杂性,只要它们被正确记录和组织。 – 2012-04-08 00:55:45

+0

另请注意,此方法不需要任何条件代码。 – 2012-04-08 00:56:20

3

你可以这样做:

class A implements Runnable { 
    int constructor; 

public A(int var) { 
    //things go here 
    constructor = 1; 
} 

public A(int var1, String var2) { 
    //things go here 
    constructor = 2; 
} 

public void run() { 
    if (constructor == 1) ... 
    if (Constructor == 2) ... 
} 

}

但我会建议使用多态。它看起来像是两种不同类型的对象。

+0

@drum - 是 - 使用'if'或'case'声明:您有选择地运行任何一段代码相同的方式。 – jefflunt 2012-04-08 00:42:22