如何用静态方法设计类
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
被隐藏并且无法知道调用代码来自 StaticChildA
或 StaticChildB
。如果我们在 commonMethod
中打印堆栈跟踪,我们会从两个调用中看到以下内容:
testpackage.UnitTester$StaticParent.commonMethod(UnitTester.java:4497)
testpackage.UnitTester.main(UnitTester.java:4526)
没有 this
或堆栈中的差异,甚至无法手动在代码内部分支来选择 tx()
.
的实现
我想在下一种情况下避免代码重复:我有两个 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
被隐藏并且无法知道调用代码来自 StaticChildA
或 StaticChildB
。如果我们在 commonMethod
中打印堆栈跟踪,我们会从两个调用中看到以下内容:
testpackage.UnitTester$StaticParent.commonMethod(UnitTester.java:4497)
testpackage.UnitTester.main(UnitTester.java:4526)
没有 this
或堆栈中的差异,甚至无法手动在代码内部分支来选择 tx()
.