【发布时间】:2022-01-04 23:06:58
【问题描述】:
我正在尝试将 JavaScript 代码转换为 Java 代码。
在JavaScript中,接口可以有属性,一个接口可以扩展多个接口:
interface Interface1 {
name?: string
age?: number
}
interface Interface2 {
id?: string
}
interface InterfaceCombination extends Interface1, Interface2 {
position?: string
}
我想将此 JavaScript 代码翻译成 Java 代码。我有几个想法,但我不知道它们是否是好的设计。
第一个想法:类和委托
由于Java接口只有final static属性,我选择类来维护这些属性:
public class Class1 {
private String name;
private Number age;
public String getName();
public void setName(String name);
... // getter & setter for age
}
public class Class2 {
private String id;
... // getter & setter for id
}
但是,问题就来了。一个Java类只能扩展一个类,所以我选择使用委托:
public class ClassCombination {
private Class1 class1;
private Class2 class2;
private String position;
public String getName() {
return class1.getName();
}
... // getters & setters
}
当委托层次结构很深时,这将导致大量重复工作。我尝试在 lombok 中使用 @Delegate 注解,但这是实验性的,不支持递归委托。
第二个想法:接口 & getter & setter
虽然一个Java类只能扩展一个类,但一个Java接口可以扩展多个接口。
public interface Interface1 {
public String getName();
public void setName();
... // getter & setter for age
}
public interface Interface2 {
... // getter & setter for id
}
public interface InterfaceCombination extends Interface1, Interface2 {
... // getter & setter for position
}
此解决方案将导致在接口中编写 getter 和 setter 的工作量很大。而且我不能使用 lombok 在接口中自动生成 getter 和 setter。
有没有更优雅、更容易实现的解决方案?
【问题讨论】:
-
您的 IDE 将为您编写所有的 getter 和 setter。根本没有太多工作。
-
@BasilBourque 你能告诉我哪个 VS Code 扩展可以做到这一点吗?
-
您可以根据类的实际含义重构类。如果 Combo 类 IS-NOT Class1/Class2,您可能更喜欢第一种方法中的组合。如果有任何直接关系,则首选第二种方法。另外,如果接口1和接口2不需要独立,也可以组合使用。
标签: javascript java oop lombok delegation