如何用静态方法设计类

How to design classes with static methods

我想在下一种情况下避免代码重复:我有两个 classes NewTx 和 GetTx,第一个代表新交易,第二个代表加入当前的交易。目标是使 CRUD 代码尽可能紧凑,因此 classes 通常用作:

List<Users> users = NewTx.loadList("select u from User u");
Student s = GetTx.find(Student.class, '02d7c3fe-e9cf-11e4-8ceb-c7b1b9baf140');

这些classes实际上只是在获取交易的方式上有所不同,但它们的所有方法都是静态的,因此似乎无法将逻辑移至父class。

现在我有

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 classes 不同,其他方法只是获取交易而不是将工作委托给父 Tx class.

所以目标是将所有 CRUD 方法(如 loadList)移动到父 class Tx。

限制:方法调用必须像以前那样:NewTx.load(...,而不是 NewTx.get().load(..

有什么想法吗?

您的目标不会在您设置的当前限制条件下实现。如果您愿意更改方法调用,有多种方法,但是将常见的静态调用移动到共享 class 中是行不通的,因为静态方法不能在 java 中继承,只能隐藏。考虑以下因素:

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()StaticChildB.commonMethod() 都将打印 "Parent" 因为 commonMethod 被隐藏并且无法知道调用代码来自 StaticChildAStaticChildB。如果我们在 commonMethod 中打印堆栈跟踪,我们会从两个调用中看到以下内容:

testpackage.UnitTester$StaticParent.commonMethod(UnitTester.java:4497)
testpackage.UnitTester.main(UnitTester.java:4526)

没有 this 或堆栈中的差异,甚至无法手动在代码内部分支来选择 tx().

的实现