首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用根据唯一键生成的属性创建对象

如何使用根据唯一键生成的属性创建对象
EN

Stack Overflow用户
提问于 2011-04-08 00:25:57
回答 4查看 9.1K关注 0票数 0

我希望拥有具有一系列属性和一个唯一标识键的对象。因为键是唯一的,所以它可以用来挑选一组特定的属性。我希望能够在实例化对象时使用键,以便与该键关联的属性成为该对象的属性。

属性规范将是规则的(也就是说,如果一个键有一个名为description的属性,那么每个其他键也是如此)。

一个不好的例子

这个例子是我最初试图解决这个问题的方法,而且是不够的。我在这里张贴它是为了说明这种方法的问题。

我可以有一个有名字和描述属性的食物类。在这种情况下,名称应该是唯一的密钥,在这种情况下,只是一个描述。

代码语言:javascript
复制
public class Food {
  private String name;
  private String description;

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

这种方法的问题

首先,每当我制作一种特定的食物,比如比萨饼,我每次都要输入同样的描述,比如“一种受欢迎的意大利菜”。我想要的是能够创建一个只知道食物名称的对象,然后为我填充其余的属性。换句话说,我应该能够传递披萨,对象将被创建一个适当的描述。

其次,这个示例不能保证name属性的唯一性。我可以制作一个比萨饼,上面写着“一种受欢迎的意大利菜”,另一种描述是“奶酪的美味!”但是,我希望名称能够唯一地选择一组属性。当然,一个属性可以属于多个键(比萨饼和意大利面都可以有“意大利菜”的描述),但是键只能有一个特定的描述。

潜在解决方案

我想这至少需要两件事:

  1. 以某种方式将名称与一组属性关联起来。一个HashMap似乎是理想的,但在哪里会是一个很好的位置存储它?把它放在Food类中似乎很奇怪。
  2. 是一些创建类,它处理食物对象的构建(也许这将是上面的HashMap的一个好位置?)我研究了Factory和Builder模式,但工厂似乎是用来创建不同的子类的,我希望能够存储1000 s的不同项名(而不是创建不同子类的1000 s)。Builder似乎是为了更容易地指定对象的所有属性,从而记住构造函数中参数的顺序,同时也保证对象不能半路实例化,但这似乎与我所寻找的几乎相反。

EN

回答 4

Stack Overflow用户

发布于 2011-04-08 00:40:54

Map是存储预定义属性的良好数据结构。但是您需要一个将属性复制到对象的代码,即调用代码,如下所示:

food.setDescription(attrs.get("description"))

此代码可以在工厂中编写。工厂不一定要创建不同类的实例。它可以创建同一个类的实例并启动它们。

其他方法是使用名为template对象的模式。这意味着您可以创建多个对象,如比萨饼、意大利面、木桩、汤等,这些对象的属性已经预先定义好了。然后,当您需要创建另一个比萨饼时,首先创建一个已经存在的比萨饼的副本,然后对其进行修改,使其成为您的特定比萨饼。java中创建现有对象副本的方法有多种:复制构造函数、克隆、序列化等。

票数 1
EN

Stack Overflow用户

发布于 2011-04-08 00:32:46

我同意hashmap是理想的,我推荐的是某种mapper实用类,它可以从xml文件或数据库中获取您的名称和描述,然后将它们插入到哈希映射中。这就是你的hashmap住的地方。然后,您可以使用工厂来构造您的食物对象,并从hashmap注入名称和描述依赖项。

票数 0
EN

Stack Overflow用户

发布于 2011-04-08 00:33:58

您需要一个工厂和一些重载的构造器。

代码语言:javascript
复制
public class Food {

  private static final String DEFAULT_DESCRIPTION = "My favorite!";
  private String name;
  private String description;

  public Food(String name) { 
     this(name, DEFAULT_DESCRIPTION);
  }

  public Food(String name, String description) {
    this.name = name;
    this.description = description;
  }
}

class Pizza extends Food {

  private static final String DEFAULT_DESCRIPTION = "A popular Italian dish";

  public Pizza(String name)
  {
     super(name, Pizza.DEFAULT_DESCRIPTION);
  }

  public Pizza(String name, String description) {
     super(name, description);
  }

}

public class FoodFactory {

    private static final FoodFactory instance = new FoodFactory();

    private FoodFactory() {}

    public static FoodFactory getInstance() { retun this.instance; }

    public Food create(String name, String description) {
        // Here's where you can create different kinds of food based on your requirements
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5589123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档