我希望在下一种情况下避免代码重复:我有两个类NewTx和GetTx,第一个代表新事务,第二个代表一个事务,它加入当前。目标是使CRUD代码尽可能紧凑,因此类通常用作:
List<Users> users = NewTx.loadList("select u from User u");
Student s = GetTx.find(Student.class, '02d7c3fe-e9cf-11e4-8ceb-c7b1b9baf140');
这些类实际上只是以获取事务的方式不同,但它们的所有方法都是静态的,所以将逻辑移到父类似乎是不可能的。
现在我有了
public final class NewTx extends Tx {
public static <T> List<T> loadList(String query) {
return tx().call(Tx.<T>getLoadListCallable(query));
}
static Transaction tx() {
return DataSource.createTransaction();
}
正如我之前所说,只有tx()方法对于NewTx和GetTx类是不同的,其他方法只是获取事务而不是委托作业到父Tx类。
所以我们的目标是将所有CRUD方法(如loadList)移动到父类Tx。
限制:方法调用必须像以前一样:NewTx.load(...,而不是NewTx.get()。load(..
有什么想法吗?
答案 0 :(得分:1)
您的目标不会因您当前的限制而发生。如果您愿意更改方法调用,有多种方法,但将公共静态调用移动到共享类中并不起作用,因为静态方法不能在java中继承,只能被遮蔽。请考虑以下事项:
globals()
public static class StaticParent
{
public static void commonMethod(){
System.out.println(getOutput());
}
public static String getOutput(){
return "Parent";
}
}
public static class StaticChildA extends StaticParent
{
public static String getOutput(){
return "ChildA";
}
}
public static class StaticChildB extends StaticParent
{
public static String getOutput(){
return "ChildB";
}
}
和StaticChildA.commonMethod()
都会打印&#34; Parent&#34;因为StaticChildB.commonMethod()
被遮蔽,无法知道调用代码来自commonMethod
或StaticChildA
。如果我们在StaticChildB
中打印堆栈跟踪,我们会在两个调用中看到以下内容:
commonMethod
如果堆栈中没有testpackage.UnitTester$StaticParent.commonMethod(UnitTester.java:4497)
testpackage.UnitTester.main(UnitTester.java:4526)
或差异,则无法手动分支代码内部以选择this
的实现。