如何向属性添加属性?

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

我有一个具有各种属性的 Pojo,例如

class Book {
  public String title;
}

(为简洁起见,省略了 getter 和 setter。)

现在我想拥有这些属性的属性,例如“这个

title
值是从
config.yaml
第 3 行第 5 列读取的”。 (这是我的用例,但我想还有更多。)

我可以添加一个

title_src
属性,没问题。
不过,对数十个属性执行此操作需要大量样板代码。

还有耦合。在上面的例子中,错误消息需要了解元属性,实际处理不需要。

A

Map
从属性到元属性? 这会解耦,但我认为没有好的方法可以在不通过反射的情况下构造密钥,并且密钥必须是对象/属性名称组合。

StringWithSource 类型?这将使该属性的每次使用都知道该类型,因此我们具有非常强的耦合,尽管是无反射的。

还有其他设计选项吗?
有更好的方法来实施我已有的选项吗?

java properties pojo
1个回答
0
投票

现在我想要拥有这样的属性的属性

您的属性似乎不应仅由其实际值组成,因为您已经讨论了标题源、标题行、标题列等。

您的

title
属性可能应该被分解并重构为一个类,例如带有字段的
TitleInfo
value
src
line
column
等。

class TitleInfo {
    private String value;
    private String src;
    private int line;
    private int column;

    ...
}

class Book {
    private TitleInfo title;
}

但是,如果我们进一步推动这个想法,我们可以将其推广并扩展到其他十几个领域。事实上,您可以创建一个泛型类

PropertyInfo<T>
,它可以表示值
T
的泛型属性及其所有详细信息(
src
line
column
等)。

class PropertyInfo<T> {
    private T value;
    private String src;
    private int line;
    private int column;

    ...
}

class Book {
    private PropertyInfo<String> title;
    private PropertyInfo<String> author;
    private PropertyInfo<BigDecimal> price;

    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.