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 扩展 interfaceclass 实现 interfaceclass 扩展 class 请注意,将属性设置为public 并不是解决“我不想键入多个 getter 和 setter”的好方法,因为大多数 IDE 都为您提供了自动生成 getter 和 setter 的选项。此外,getter 和 setter 确实有很多 advantages。 (+ 接口只能扩展其他接口,不能实现它)

以上是关于Java:如何将两个类的属性合二为一?的主要内容,如果未能解决你的问题,请参考以下文章

验证属性时将两个正则表达式合二为一

Java中有没有啥办法可以将两个类的属性值映射?

如何使用条件语句将两个搜索结果语句合二为一?

如何将两个 mp3 文件合并为一个(合并/加入)

如何将两个 sql 查询合二为一? [复制]

如何将两个文件合二为一以备后用