gpt4 book ai didi

Java 域模型 : categories with specific subcategories

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:36 26 4
gpt4 key购买 nike

我有一个类产品。每个产品可以有任意数量的类别:

public class Product
{
private List<Category> categories

...
}

每个类别都有自己独特的子类别集。例如:

  • 类别“红色”有子类别“栗色”、“橙色”、“波尔多”
  • 类别“蓝色”有子类别“浅色”、“深色”、“天蓝色”

对于每组子类别,我创建了一个具有可能静态值的枚举:

public enum RedSubCategory
{
MAROON, ORANGE, BORDEAUX;
}

public enum BlueSubCategory
{
LIGHT, DARK, AZURE;
}

我现在正在努力创建类别类。因为每个类别都有很好的定义,所以我想把它做成一个枚举。然而,每个枚举值都应该有一个不同子类型的子类别列表,这是行不通的:

public enum Category
{
RED, BLUE;

private List<SubCategory> subCategories;

// This won't work! SubCategory is not a real class and the
// SubCategory enums can't extend from a common supertype!
public setSubCategories(List<SubCategory> subCategories)
{
this.subCategories : subCategories;
}
}

如果我将 Category 设为类而不是枚举,我会遇到同样的问题。我可以使用泛型来解决这个问题,但是我丢失了所有可能类别的静态定义。此外,如何才能使类别 RED 成为唯一可以使用 RedSubCategories 的类别?通过使用具有泛型的类,没有什么可以阻止我创建具有类别“蓝色”和红色子类别的类别对象!

我可以在这里使用任何模式或继承/泛型技巧吗?

最佳答案

可能正在使用 java 接口(interface):



package basic;

import static basic.SubCatMain.RedSubCategory.*;
import static basic.SubCatMain.BlueSubCategory.*;

public class SubCatMain {

public interface Category {
}

public enum MainCategory implements Category {
RED(MAROON, ORANGE, BORDEAUX),
BLUE(LIGHT, DARK, AZURE);

final private Category[] subcategories;

private MainCategory(Category... subcategories) {
this.subcategories = subcategories;
}

public Category[] getSubcategories() {
return subcategories;
}
}

public enum RedSubCategory implements Category {
MAROON, ORANGE, BORDEAUX;
}

public enum BlueSubCategory implements Category {
LIGHT, DARK, AZURE;
}

public static void main(String[] args) {
// do something with your categories
}

}

编辑

@user1884155:关于“我想确保产品不能有红色类别但有蓝色子类别列表”。

我认为您不能仅在编译时使用强制转换来做到这一点。编译器无法知道哪个主要类别将提供给 Product ctor。需要编写一些业务规则,例如:

 

public static class Product {
final private MainCategory category;
private Category[] categories;

public Product(MainCategory category) {
this.category = category;
}

protected void checkCategoriesAreValid(Category... categories) {
// throw an exception if at least one of the categories
// is not valid in respect of some business rules
// by default any sub-category of a main one is ok
List refs = Arrays.asList(category.getSubcategories());
for(Category c:categories) {
if (!refs.contains(c)) {
throw new IllegalArgumentException("...");
}
}
}

public Category[] getCategories() {
return categories;
}

public void setCategories(Category... categories) {
checkCategoriesAreValid(categories);
this.categories = categories;
}

}

关于Java 域模型 : categories with specific subcategories,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33871213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com