gpt4 book ai didi

java - 在层次结构中为每个类创建一个对象实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:09 26 4
gpt4 key购买 nike

我在面试中被问到这个问题。

有 3 个类 A , B extends A & C extends B .我们必须设计符合这些约束的这些类

  • 客户端只能实例化A 的一个实例, B 的一个实例& 一个 C 的实例使用默认构造函数 new关键字。
  • 尝试创建任何这些类的另一个实例将导致异常。
  • 类的设计者必须强制执行上述 2 条规则,以便客户隐含地体验上述规则(即客户不应该有责任遵守上述规则)。

我建议使用 static Map<Class, Object> 的方法.所以例如当有人调用 new B()它会检查是否 map.contains(B.class) .如果是,则抛出异常,如果不是,则将实例保存在 map 中,然后创建对象。

但下一个问题是我如何在每个类(class)上实现这种方法?按照我的方法,每个构造函数都必须小心地填充 map ,否则它会打破约束。

我该如何解决这个问题?

最佳答案

But the next question was how would I enforce this approach on each class? As per my approach each constructor would have to carefully populate the map otherwise it will break the constraint.

只需将该 map 及其周围的代码放入某个不同的 Utility 类即可。这样您的每个类(class)都可以执行以下操作:

public WhateverClassConstructor() {
synchroized(someLock) {
SingeltonChecker.ensureUnique(this);

 public static void ensureUnique(Object objectToAdd) {
Class<?> classToAdd = o.getClass();
...

鉴于 C extends B extends A 这一事实,您可能只需要在类 A 的构造函数中调用该调用。另一方面,假设您对 new C() 的第一次调用导致C 构造函数的异常,但第二次调用不会。当然,这本身就是一个问题,但问题仍然存在:如何确保对象在添加到这样的映射之前已完全正确地初始化?!

因此:在编写此类实用程序代码时需要考虑的事情。因此,我的回答将集中在给定设计点的不切实际,几乎是愚蠢的,并建议将其丢弃并寻求其他解决方案,例如简单的方法:

public enum SingletonObjectHolder {
private final Object hold;
A_INSTANCE(new A()), B_INSTANCE(new B())...

public Object getSingleton() { return hold; }
private SingletonObjectHolder(Object o) { hold = o };

真正的重点是不要搬起石头砸自己的脚时,不要浪费太多时间试图给人们一个技术性的答案。别搞错了:让基于 map 的“单例”方法在各种情况下都能稳健且正确地工作,认为这真的很难

换句话说:如果我在采访中问你这个问题,我想听到一个挑战那个可怕的设计点的答案。当然,花 10% 的时间为给定场景概述解决方案。但要花 90% 的时间来解释为什么它如此糟糕,以及为什么其他解决方案会好得多。

关于java - 在层次结构中为每个类创建一个对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56328095/

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