gpt4 book ai didi

java - 在类中使用内部类是一个好的设计吗?

转载 作者:搜寻专家 更新时间:2023-11-01 03:35:57 29 4
gpt4 key购买 nike

我有一个名为 SalesOrder (SO) 的类,它允许用户在一个订单中购买多件商品。 SO 有订单号。

class SalesOrder {
public String orderNumber;
}

每个 SO 中都有很多项目,所以我创建了一个新类 OrderItem,其中包含项目名称和价格。

class OrderItem {
public String name;

public double price;
}

每个 SO 都有一个订单标题,包括用户名和地址。它还有一个名为 total price 的字段,它包含所有项目价格的总和

class OrderHeader {
public String username;

public String address;

public double totalPrice;
}

之后,我在SO中添加了两个字段:

class SalesOrder {
...

public List<OrderItem> items;

public OrderHeader header;
}

因为 OrderItem 和 OrderHeader 总是与 SalesOrder 一起使用并且 header 应该返回所有商品价格,所以我将它们转换为 SalesOrder 的内部类。

class SalesOrder {


...

public SalesOrder() {
this.items = new ArrayList<>();
this.header = new OrderHeader();
}

public class OrderItem {
...
}

public class OrderHeader {
...

public double getTotalPrice() {
double total = 0.0;
// loop SalesOrder.items
total += items[i].price;
return total;
}
}
}

我的问题是像这样使用内部类是否是好的 OOP 设计?如果不是,应该如何设计?

=======更新一些信息=======

很抱歉我没有提供更多信息。

Header 和 Item 使它们解释方法私有(private),没有 SalesOrder 其他对象不能创建它们。

SalesOrder 有一个工厂方法

class SalesOrder {
...

public SalesOrder parseOrder(Xml xml) {
//init header and items from xml
this.header = new OrderHeader(valueFromXml, valueFromXml);
}

public class OrderHeader {
....
private OrderHeader(username, address) { ... }
}

public Class OrderItem {
...

private OrderItem(name, price) { ... }
}
}

其他对象像这样使用它们

Xml xml = orderXmlData;
SalesOrder order = SalesOrder.parseOrder(orderXmlData);
OrderItem item = order.item;
OrderHeader header = order.header;

最佳答案

我有一些建议可以改进您的设计。首先,在我看来,totalPrice 不太可能成为 header 的一部分。它似乎更有可能是从订单项目中派生出来的,而不是作为标题的一个组成部分。其次,除非您希望类的客户创建独立于订单的订单项,否则似乎没有必要将它们定义为一个类。最好转换为从订单返回的 interface。第三,Header 没有理由不能是接口(interface) - 这允许客户端使用他们想要的任何类作为 header ,只要它具有名称和地址即可。

所以我的建议是这样的:

class Order {

interface Item {
String getName();
double getPrice();
}

interface Header {
String getName();
Address getAddress();
}

public Order(Header header) {
...
}

public double getTotalPrice() {
return streamItems().mapToDouble(Item::getPrice).sum();
}

public void addItem(String name, double price) {
...
}

public Stream<Item> streamItems() {
...
}
}

关于java - 在类中使用内部类是一个好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578324/

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