有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从多个接口实现强大内聚的最佳实践

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

当我构建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 {...}
...

此外,重要的是,“设备”类及其接口是公共的,因此将包含在存根库中。其他任何内容都将只包含在实际库中,并且对于通过引用API生成脚本的用户不可见


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

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

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

例如,有一个管理器类使用“设备”对象和“标记器”、“解析器”和“编译器”对象。如您所见,“ADevice”对象只能与“ATokenizer”、“AParser”或“ACompiler”成对出现。然而,若我们从接口定义了设备对象的类型,那个么除了运行时的“instanceOf”操作符外,我们无法判断这些对象是否对应于正确的“标记器”、“解析器”或“编译器”对象。 例如,“ADevice”可以与“BTokenizer”、“CParser”等匹配,这样就不会产生编译错误

我希望我能听到一个好的答案,或者转到参考文献


共 (2) 个答案

  1. # 1 楼答案

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

    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
    
  2. # 2 楼答案

    你想过通用接口吗

    界面如下:

    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...
        }
    
    }