Java接口和类定义

Java接口和类定义,java,interface,Java,Interface,我试图理解我收到的一段Java代码(我是一名C#程序员) 在另一个类中,它是这样使用的 protected void ShowTxn(long int) { TxnDA txnda = (TxnDA) appContext.getBean("txnDA"); txnda.getTxn(id) } 所有类扩展一个基类并实现一个接口。java代码中的每一个类几乎都是这样 问题 1-有人能给我解释一下这个代码吗?我已经知道,当我们想要耦合软件、插件、隐藏实现细节时,我们会使用接口(在

我试图理解我收到的一段Java代码(我是一名C#程序员)

在另一个类中,它是这样使用的

protected void ShowTxn(long int) {
    TxnDA txnda = (TxnDA) appContext.getBean("txnDA");
    txnda.getTxn(id)
}
所有类
扩展一个基类
实现一个接口。java代码中的每一个类几乎都是这样

问题 1-有人能给我解释一下这个代码吗?我已经知道,当我们想要耦合软件、插件、隐藏实现细节时,我们会使用接口(在C#中)

2-由于上述条件都不适用于此java库,按如下方式修改代码是否安全

public class BaseDA extends HibernateDaoSupport {
    ...
}

public class TxnDA extends BaseDA {

    public Txn getTxn(long id) {
        ....
    }
}

这是一种经典的方法,理论上应该确保代码易于扩展和松散耦合。如果您查阅旧的Java书籍,您会在许多代码体系结构示例中发现这一点

然而,这种方法是不干净的,不是真正有利可图的,你绝对不应该自己做,除非它是你喜欢的风格(我认为它不是,因为你试图理解它)

软件工程已经发展了很多,现代的方法是关注代码的可理解性和干净性。以上述方式编写它将导致非常困难的调试,并且需要大量的时间让新程序员掌握项目

另一方面,这只是一个架构决策,所以它并不是直接的“坏”。它完全过时了:-)


至于问题#2-是的,这似乎是合理的,尽管我不能保证它会起作用,但您没有提供足够的代码和上下文。

我认为对于C#代码也可以进行类似的讨论。不是非常特定于语言的。@Thilo,我从2001年开始编写C#,还没有见过有人为代码中的每个类创建接口,但这不是我收到的第一个java库,也是这样编写的。我想知道这是一种最佳实践、必要性还是我不知道的东西。我在C#中也看到过类似的库。如果需要的话,这种做法会很好,也就是说,如果您需要多个impl来实现相同的功能。在这种情况下,我认为lib是关于数据访问的,您基本上可以为另一个db引擎重新实现接口,我甚至不认为它过时了。在这种情况下,这是一种过火的行为,可能正是由于这种想法而引入的,即未来可能会有多个从未实现过的实现。对于需要从应用程序外部访问的API的公共接口来说,这样做是完全可行的,即使您知道也只有一个实现类,但是您当然会将接口打包到它们自己的jar中。当然,这是一种过分的做法,但实际上它被认为是最好的方法。让代码为扩展打开等等。但是,现在有了新的模式,它不会给你留下数千个单一使用的接口。@jwenting,我想你的假设是正确的,类和接口打包在同一个jar文件中。实际上每个类中没有太多的代码,我想实现的一些类也可以合并,因为它们的功能只使用一次。您是对的,我们在调试应用程序中的一个问题时遇到了麻烦,而跟踪类的源并不容易,因为所有声明都是针对接口而不是类的。是的,对于这样的项目,唯一可用的调试选项是使用断点,然后执行到实际使用的类。。。这很糟糕,而且确实会适得其反:-(因此,是的,稍微展平一点包是个好主意,如果需要添加其他实现,您可以在以后以更好的方式取消展平它:-)
public class BaseDA extends HibernateDaoSupport {
    ...
}

public class TxnDA extends BaseDA {

    public Txn getTxn(long id) {
        ....
    }
}