Java:如何将两个类的属性合二为一?
Posted
技术标签:
【中文标题】Java:如何将两个类的属性合二为一?【英文标题】:Java: How to combine attributes of two classes into one? 【发布时间】: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不需要独立,也可以组合使用。 【参考方案1】:如果您不想键入多个 getter 和 setter,您可以随时公开属性。 此外,在 Java 中,代码应该是:
public interface InterfaceCombination implements Interface1, Interface2
没有
public interface InterfaceCombination extends Interface1, Interface2
【讨论】:
感谢您的回答。如果我公开属性,用户应该通过ClassCombination.class1.name
访问name
,而不是预期的ClassCombination.name
。此外,在 Java 中,interface
扩展 interface
,class
实现 interface
,class
扩展 class
。
请注意,将属性设置为public
并不是解决“我不想键入多个 getter 和 setter”的好方法,因为大多数 IDE 都为您提供了自动生成 getter 和 setter 的选项。此外,getter 和 setter 确实有很多 advantages。 (+ 接口只能扩展其他接口,不能实现它)以上是关于Java:如何将两个类的属性合二为一?的主要内容,如果未能解决你的问题,请参考以下文章