gpt4 book ai didi

java - 设计一个对象层次结构,对象可以在其中解析自己

转载 作者:行者123 更新时间:2023-11-29 08:31:02 25 4
gpt4 key购买 nike

我正在设计一个具有模拟对象层次结构的模拟器。要引导模拟器,必须从文件加载初始对象。每个对象都必须从简单的键值文本表示中解析自身。我们会不时地添加新的对象类。

不幸的是,Java 中没有“静态继承”。特别是,如果有以下方法会更好:

public class SimObject {
/**
* (unfortunately illegal) - to be implemented by subclasses,
* returns a new object if successful, or none on failure.
*/
static abstract SimObject buildFromAttributes(Map<String,String> attrs);

// ... other constructors, behavior
}

这将允许使用类似于以下解析代码的东西,它通过查找正确构建它的第一个解析器来创建适当类型的 SimObject:

public SimObject parse(Map<String,String> attrs, Class<SimObject>[] classes) {
for (Class<SimObject> c : classes) {
SimObject o = c.buildFromAttributes(attrs); // illegal, I know
if (o != null) return o;
}
throw new IllegalArgumentException("Could not create valid simobject");
}

因为那是不可能的,所以我目前正在使用

public class SimObject {
/** empty constructor, to call buildFromAttributes from */
SimObject() {}
/**
* returns a new object if successful, or none on failure.
*/
abstract SimObject buildFromAttributes(Map<String,String> attrs);

// ... other constructors, behavior
}

public SimObject parse(Map<String,String> attrs, SimObject[] instances) {
for (SimObject i : instances) {
SimObject o = i.buildFromAttributes(attrs);
if (o != null) return o;
}
throw new IllegalArgumentException("Could not create valid simobject");
}

这行得通,但是拥有一个本应为 staticbuildFromAttributes 似乎很难看,因为它不访问或修改其对象的状态。

另一种选择是使用单独的对象来进行解析(称它们为 SimObjectBuilder,并且每个 SimObject 子类都有一个);但这些对象与它们构建的对象的内部实现非常耦合,我希望代码尽可能简短明了。

附加要求:我想避免使用 "class" 属性来实现基于反射的解析(这将消除通过直接归零好的解析器来迭代可能的解析器的需要) ;或外部库。这是一个设计练习,供学习 OO 的学生使用,重点是简单明了,而不是生产代码。

最佳答案

这是我所看到的您的要求:

1) 不想定义任何新的 SimObjectBuilders 类型。

2) 不想创建 SimObject 对象只是为了解析它们。

3) 没有反射(reflect)。

然后您可以使用 lambda 表达式并构建 Function 类型,方法是将其包装在 SimObject 的每个子类中定义的静态方法中:

    SimObject o = parse( new HashMap<>(), Arrays.asList(
SimObject1::buildFromAttributes, SimObject2::buildFromAttributes ) );

public SimObject parse(Map<String,String> attrs,
List< Function<Map<String,String>, SimObject> > factories) {
for (Function<Map<String,String>, SimObject> f : factories) {
SimObject o = f.apply(attrs);
if (o != null) return o;
}
throw new IllegalArgumentException("Could not create valid simobject");
}

这是你的子类:

public class SimObject1 extends SimObject{

public static SimObject1 buildFromAttributes(Map<String,String> attrs){
return new SimObject1();
}
}

public class SimObject2 extends SimObject{

public static SimObject2 buildFromAttributes(Map<String,String> attrs){
return new SimObject2();
}
}

关于java - 设计一个对象层次结构,对象可以在其中解析自己,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48232555/

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