【问题标题】:How to design classes with static methods如何使用静态方法设计类
【发布时间】:2015-04-23 19:54:29
【问题描述】:

我想在下一种情况下避免代码重复:我有两个类 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();
    }

正如我之前所说,NewTx 和 GetTx 类只有 tx() 方法不同,其他方法只是获取事务,而不是将工作委托给父 Tx 类。

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

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

有什么想法吗?

【问题讨论】:

  • 您不能使用实例方法有什么特别的原因吗? (非静态)
  • 使用单例。仍然很糟糕,但虽然有效......

标签: java inheritance static static-methods


【解决方案1】:

根据您当前的限制,您的目标不会实现。如果您愿意更改方法调用,有多种方法,但是将常见的静态调用移动到共享类中是行不通的,因为静态方法在 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() 的实现。

【讨论】:

  • 你说的都是众所周知的,我只是希望在这里看到有疯狂想法的人最终会奏效。看来现在是不可能了。
猜你喜欢
  • 2013-09-11
  • 2011-01-03
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
相关资源
最近更新 更多