我需要帮助,如何显示一个类中具有 java 中其他类的属性的对象? [已关闭]

问题描述 投票:0回答:1

我目前正在开发一个使用继承类结构的 Java 项目。我有一个超类

DigitalResources
和一个继承自
DigitalBook
的子类
DigitalResources
。这两个类都有一个
id
属性,并且
DigitalBook
有几个附加属性(
numberPages
genre
editorial
description
)。

我使用 Gson 序列化和反序列化这些类的对象,以从文本文件中保存和检索它们。我还有一个

Loan
类,它具有
DigitalBook
属性。

问题是:当我创建

Loan
对象然后打印它时,
DigitalBook
的特定属性打印为
null
。但是,当我在创建
DigitalBook
对象后直接打印它时,所有属性都会正确显示。

该项目由用例构成,文件夹结构包括

data
domain
presentation
。它还包括 CRUD 操作。

此练习的目标是将产品数字化。为此,必须获得客户的所有需求,并将客户的需求转化为数字化解决方案。由于数字格式的兴起,阿维拉的数字图书馆需要一个应用程序来对所有类型的数字馆藏进行编目:书籍、音乐、视频、软件等。

项目声明 图书馆需要对数字馆藏进行分类,因此不能等待应用程序完全开发出来。他们告诉我们,最初他们想要对数字图书进行分类。此外,他们需要能够管理图书馆,为此他们需要:

  • 注册、删除或修改用户数据。
  • 咨询已在数字图书馆注册的用户。
  • 注册、删除或修改资源的数据:数字图书。
  • 查阅已注册的数字资源。
  • 创建或删除贷款。
  • 咨询尚未最终确定的贷款。即资源尚未归还的贷款。
  • 查询已经确定的贷款。即所借资源已归还的贷款。

我已将项目上传到我的 GitHub 帐户,您可以在这里查看。问题的部分已在活动拉取请求中上传。有兴趣的话就关注我吧

所以,我的问题是:有谁知道如何解决这个问题,即从

DigitalBook
对象打印时
null
的特定属性打印为
Loan
,但直接打印
DigitalBook
对象时打印正确?

任何帮助将不胜感激。预先感谢!

我尝试更改 Json 序列化,更改父级和子级之间的

id
属性。还有很多其他的事情,但没有任何效果

java serialization clean-architecture use-case
1个回答
0
投票

tl;博士

将您的超类标记为

abstract
以避免无意的实例化。

详情

您没有给我们任何可以使用的代码。所以让我给你一些示例代码。

定义你的超类,

DigitalResource
。我们将这个类设为
abstract
,因为我们打算实例化其子类的对象,但绝不会直接实例化这个类。

package work.basil.example.inherit;

public abstract class DigitalResource
{
    public long id;

    public DigitalResource ( final long id )
    {
        this.id = id;
    }

    @Override
    public String toString ( )
    {
        // This method will never be executed. Being abstract means no such object can be instantiated.
        return "DigitalResource{" +
                "id=" + id +
                '}';
    }
}

定义一个具体的子类,

DigitalBook
。该子类继承其超类的字段,
DigitalResource

package work.basil.example.inherit;

public class DigitalBook extends DigitalResource
{
    int numberPages;
    String genre, editorial, description;


    public DigitalBook ( final long id , final int numberPages , final String genre , final String editorial , final String description )
    {
        super( id );
        this.numberPages = numberPages;
        this.genre = genre;
        this.editorial = editorial;
        this.description = description;
    }

    @Override
    public String toString ( )
    {
        return "DigitalBook{" +
                "id=" + id +
                ", description='" + description + '\'' +
                ", editorial='" + editorial + '\'' +
                ", genre='" + genre + '\'' +
                ", numberPages=" + numberPages +
                '}';
    }
}

注意子类和超类都重写了继承的方法

Object#toString
。那么,当在
toString
引用变量中保存的
DigitalBook
对象上调用
DigitalResource
时,将执行哪个
toString
方法实现?由于多态动态调度的魔力,最具体的子类的实现获胜。让我们看看实际效果。

package work.basil.example.inherit;

public class App
{
    public static void main ( String[] args )
    {
        App app = new App( );
        app.demo( );
    }

    private void demo ( )
    {
        DigitalResource resource = new DigitalBook( 1 , 42 , "Fiction" , "Good book" , "Blah." );

        System.out.println( "resource = " + resource.toString( ) );
    }
}

运行时输出:

resource = DigitalBook{id=1, description='Blah.', editorial='Good book', genre='Fiction', numberPages=42}
© www.soinside.com 2019 - 2024. All rights reserved.