【问题标题】:Static member inheritance and access through child member in JavaJava中通过子成员的静态成员继承和访问
【发布时间】:2017-09-20 12:26:36
【问题描述】:

我这里有以下情况:

  Room { price; }
        |
      ------
    /        \
standard    suite

我想设置标准间的价格,使其在standard 的所有实例中保持不变,并且不得影响suite 的价格,反之亦然。我尝试将price 保留在Roomstatic 中,并通过子类中的getter 和setter 访问它,但它不起作用。我也不愿意在每个子类中创建price 成员,因为我不喜欢那种解决方案。也许还有另一个漂亮的 OOP 解决方案。

【问题讨论】:

  • 与您的实际问题无关,我认为您的要求“我想设置标准间的价格,使其在所有标准对象中保持不变”是一个错误的决定。你应该重新考虑一下。房间价格甚至可以是同一天同一实体房间的个人价格,具体取决于预订者和预订时间(至少在大多数酒店中)。
  • 您需要一个漂亮的 OOP 解决方案,但使用静态限制了这些解决方案。 为什么 price 需要是静态的?
  • @Fildor 但遗憾的是,这不是必需的
  • @AndrewS 因为我想让所有标准间(即其对象)的标准间价格相同。
  • 所以我猜你对此没有影响。尽管如此,我建议记住这可能会很快改变。

标签: java oop static


【解决方案1】:

RoomSuite 类中都有一个单独的static 字段是最快/最简单的解决方案。

            Room
     _________|_______
    /                 \
Standard               Suite
|                      |
 `static int price;     `static int price;

或者,您可以在 Room 类中创建一个 static Map<Class<? extends Room>, Integer>,该类存储每个 Room 类型的基本价格。

public class Room {
    private static Map<Class<? extends Room>, Integer> prices =
            new HashMap<>();

    public final int getRoomBasePrice() {
        // If a Room subclass does not have a specific base price, return
        // 1000 by default.
        return Room.prices.getOrDefault(this.getClass(), 1000);
    }

    /** Sets the base price for the specified Room type.
     */
    public final void setRoomBasePrice(int price) {
        Room.prices.put(this.getClass(), price);
    }
}

使用上面的代码将确保价格在类的所有实例中保持不变。

mySuite.setRoomBasePrice(2000);
(new Suite()).getRoomBasePrice(); // -> 2000

编辑:经过重新考虑,我意识到使用static 不是解决问题的正确方法,因为它会使代码变脆且难以更改。

最好的方法是有一个单独的RoomPriceService 类,它提供了一个查询来获取特定房间类型的价格。

public class RoomPriceService {

    private Map<Class<? extends RoomType>, Integer> prices;

    public RoomPriceService(int defaultPrice) {
        this.prices = new HashMap();
    }

    public void setPriceOfRoomType(Room r, Integer price) {
        this.prices.set(r.getClass(), price);
    }

    public Integer getPriceOfRoomType(Room r) {
        // You can expand on this code by adding setters/getters for
        // setting and getting the default room price.
        return this.prices.getOrDefault(r.getClass(), 100);
    }

}

这样,您可以拥有多个 RoomPriceService 实例,这些实例可以存储不同情况下的价格(例如,您可以为每个季节拥有一个 RoomPriceService,或为不同的促销活动创建一个 RoomPriceService,等等)。

【讨论】:

  • 您提供的解决方案也可以在没有static 变量的情况下使用。这只是“......一个解决方案”我宁愿说。
  • @Fildor,你是对的。我添加了另一个更面向对象的解决方案。
  • @GeorgeThomas 好的,那将是另一个。我不喜欢它:知道房价是“房间”类的责任吗?这不是更适合专用的 RoomPrice DataService 或 Lookup 吗?再说一遍:我强烈认为房价不应该是一成不变的。在我住过的大多数酒店中,房价将取决于房型、入住日期(季节/镇上的大型活动......)、入住时间、预订日期、预订平台、个人折扣(里程卡、常客, ...) ... 仅举几例。
  • @Fildor 9 个月后,我根据您的建议修改了我的答案;你介意看看吗?我重新考虑并意识到静态不是解决问题的最佳方法。
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 2018-08-25
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多