实现多个接口内聚的最佳实践



首先,很抱歉我的措辞不完美,如果有不清楚的地方请告诉我。

当我正在构建java应用程序的类结构时,我想知道是否有已知的最佳实践,我还没有在我的情况下找到。

例如,有A、B、C等多个类指定设备类型,每个设备都有标记器、解析器和编译器。

首先,我有四个这样的接口。

interface Device {
    public void x();
    public int y();
    public String z();
    ...
}
interface Tokenizer {...}
interface Parser {...}
interface Compiler {...}

实际的具体类是

public class ADevice implements Device {...}
public class BDevice implements Device {...}
public class CDevice implements Device {...}
class ATokenizer implements Tokeninzer {...}
class BTokenizer implements Tokeninzer {...}
class CTokenizer implements Tokeninzer {...}
class AParser implements Parser {...}
...
class ACompiler implements Compiler {...}
...

另外重要的是, Device"类及其接口是公共的,因此将包含在存根库中。其他内容将只包含在实际的库中,对于通过引用API生成脚本的用户是不可见的。


这是我的问题,(长介绍:[)

如何实现每个类型及其对应接口之间的内聚

更详细地说,在编译时,是否有一种方法可以确定每种类型的设备接口及其相应的标记器、解析器或编译器接口之间是否正确配对?

例如,有一个管理器类使用"Device"对象、"标记器"、"解析器"one_answers"编译器";对象。正如你所看到的,"对象只能是带有"ATokenizer"、"AParser"或" accompiler "的一对。然而,如果我们从接口定义设备对象的类型,那么我们就无法判断这些对象是否对应于正确的"标记器"、"解析器"或"编译器"。对象,除了&;instanceof &;运行时中的操作符。例如,"ADevice"可以与"BTokenizer", "CParser"等匹配,并且不会生成编译错误。

我希望我能听到一个好的答案或重定向到参考

解决方案之一是将接口参数化:

interface Tokenizer<D extends Device> { ... }
interface Parser<D extends Device> { ... }
interface Compiler<D extends Device> { ... } 

那么你的实现将是:

class ATokenizer implements Tokeniser<ADevice> { ... }
class BTokenizer implements Tokenizer<BDevice> { ... }
class CTokenizer implements Tokenizer<CDevice> { ... }
class AParser implements Parser<ADevice> { ... }
.
.
.
class ACompiler implements Compiler<ADevice> { ... }

你可以在你的Manager类中有一个方法,将它们限制为相同的类型:

public <D extends Device> void doStuff(Tokeizer<D> tokenizer, Parser<D> parser, Compiler<D> compiler) { ... }

编译器将只允许按照您的描述使用它:

doStuff(new ATokeizer(), new AParser(), new ACompiler()); // works
doStuff(new ATokeizer(), new AParser(), new BCompiler()); // compiler error

你考虑过通用接口吗?

界面如下:

public interface Parser<E extends Device> {
    void parse(E device);
    void parse(String someString);
}

你可以创建这样的类:

public class AParser implements Parser<ADevice> {
    @Override
    public void parse(ADevice device) {
        //parse...
    }
    @Override
    void parse(String someString) {
        //parse...
    }
}

最新更新