如何使用静态方法设计类

时间:2015-04-23 19:54:30

标签: java inheritance static static-methods

我希望在下一种情况下避免代码重复:我有两个类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(..

有什么想法吗?

1 个答案:

答案 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()被遮蔽,无法知道调用代码来自commonMethodStaticChildA。如果我们在StaticChildB中打印堆栈跟踪,我们会在两个调用中看到以下内容:

commonMethod

如果堆栈中没有testpackage.UnitTester$StaticParent.commonMethod(UnitTester.java:4497) testpackage.UnitTester.main(UnitTester.java:4526) 或差异,则无法手动分支代码内部以选择this的实现。