我有一些方法非常相似,除了每个方法中有一行。我正在努力避免重复的代码,并在代码中应用良好的实践,但我不是OOP专家。除了一个调用之外,两种方法都是相同的:
例如:
classa.java
public static void updateTable() throws Exception {
List<T> newSchema = AvroToHive.generateSchema(...);
...
}
classb.java
public static void updateTable() throws Exception {
List<T> newSchema = AWSGlue.generateSchema(...);
...
}
我想将方法updateTable()
移到另一个公共类中,并避免在我的项目中使用类似的方法。
避免这种情况的正确方法是什么?我应该用方法generateSchema
编写一个类似"Metastore"的接口,将其实现到类AvroToHive/AWSGlue中,并将其作为参数传递,如:
public static void updateTable(Metastore metastore) throws Exception {
List<T> newSchema = metastore.generateSchema(...);
...
}
实现它的替代方案是使用函数接口。
AvroToHive示例:
import java.util.ArrayList;
import java.util.List;
public class AvroToHive {
public static List<String> generateSchema() {
ArrayList<String> values = new ArrayList<>();
values.add("Hello");
return values;
}
}
AWS数值示例:
import java.util.ArrayList;
import java.util.List;
public class AWSGlue {
public static List<Integer> generateSchema() {
ArrayList<Integer> values = new ArrayList<>();
values.add(10);
return values;
}
}
功能接口示例:
import java.util.List;
public class FuncInterExample {
@FunctionalInterface
interface ListSupplier<T> {
List<T> generateSchema();
}
public static void main(String[] args) {
updateTable(AvroToHive::generateSchema);
updateTable(AWSGlue::generateSchema);
}
public static <T> void updateTable(ListSupplier<T> obj) {
List<T> list = obj.generateSchema();
for(T item : list) {
System.out.println(item);
}
}
}
样本输出:
Hello
10
将interface
作为它们的公共父级,如下所示:
interface Common {
void generateSchema();
}
class AvroToHive implements Common {
public void generateSchema() {
System.out.println("In AvroToHive");
}
}
class AWSGlue implements Common {
public void generateSchema() {
System.out.println("In AWSGlue");
}
}
public class Main {
public static void main(String[] args) {
Common obj1 = new AvroToHive();
Common obj2 = new AWSGlue();
updateTable(obj1);
updateTable(obj2);
}
public static void updateTable(Common obj) {
obj.generateSchema();
}
}
输出:
In AvroToHive
In AWSGlue