只允许父工厂方法实例化子类

2024-04-14

我毫不怀疑这个问题已经在这里被问过并回答过十几次了,但我就是找不到满意的答案。

我有一个类系列,我只想通过这样的静态方法由抽象父类实例化(我在这里可能有拼写错误,我正在输入但没有尝试编译)。

public abstract class Papa {
    public static Papa newInstance() {
        String strClass = Papa.figureOutTheNameOfChildClassToInstantiate();
        Papa papa = (Papa) Class.forName(strClass).newInstance();
        return papa;
    }
    public abstract void doSomething();
    ...
}
public class Child extends Papa {
    public void doSomething() { /* Do something */ }
}

这或多或少就是我现在所拥有的。我想要做的是确保 Child 只能通过工厂方法 Papa.newInstance() 实例化。我尝试通过将 Child 的无参构造函数设为私有来实现此目的,但 Papa 无法实例化它。

所以,我的问题是,如何确保 Child 实例仅由工厂方法 Papa.newInstance() 创建?


如果你绝对、积极地想要强制执行这一点,那么就给Papa一个受保护的构造函数,它接受一个类型的参数Xyzzy. Make Xyzzy受保护的内部类Papa。给它一个私有构造函数。现在只Papa可以举例Xyzzy。因为您需要一个实例Xyzzy打电话Papa的构造函数,并且由于 的​​子类Papa必须从其构造函数调用其构造函数,您需要一个实例Xyzzy调用任何子类的构造函数Papa。因此,只有Papa可以调用其子类的构造函数。虽然Xyzzy没有做任何事情。

子类可能会泄漏它们的Xyzzy实例,这将允许其他代码调用子类构造函数。但你也可以通过使Xyzzy一次性使用,并且仅在单个静态工厂调用的上下文中如此。

但说实话,我不会打扰!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

只允许父工厂方法实例化子类 的相关文章

  • 用于解析和构建逻辑表达式的 Java 库

    我正在寻找一个 Java 开源库来解析和构建类似 SQL 的表达式 例如评估表达式的有效性 例如 a x or y and b z 另外我想要一个用于构建或扩展表达式的 API 就像是 Expression exp new Expressi
  • 策略模式还是命令模式?

    假设我有一个金融交易列表 我需要针对这些交易执行一系列验证规则 一个例子是我有一笔购买产品的交易 但是首先我需要验证交易中的帐户是否有足够的可用资金 产品没有售完等 由于这些规则 交易将是标记为拒绝 并应指定错误代码 当然 我正在考虑用一个
  • 将构造函数作为参数传递给方法

    我是java新手 开始研究构造函数 我看到一些构造函数作为参数传递给方法的示例 请告诉我当构造函数作为参数传递给方法时会发生什么 或者建议我一些链接 我可以在其中获得有关使用构造函数的足够知识 根据您需要传递构造函数的目的 您可以考虑传递供
  • 在 jTextfield 中禁用“粘贴”

    我有一个用 Swing awt 编写的应用程序 我想阻止用户将值粘贴到文本字段中 有没有办法在不使用动作监听器的情况下做到这一点 您可以使用 null 参数调用 setTransferHandler 如下所示 textComponent s
  • 如何作为应用程序发布到页面?

    所以 我有一个应用程序 Facebook 应用程序实体 并且我有一个页面 我想使用应用程序通过java代码 通过restfb或任何其他建议 发布到页面 看起来我错过了页面授予应用程序发布权限的阶段 不知道该怎么做 谢谢你们 乌里 您只能 作
  • 从 Spring MVC XML 文件转移到 javaconfig。我真的对我的数据库 XML 文件感到困惑

    我从 Spring MVC XML 文件转移到 javaconfig 我真的对我的数据库 XML 文件感到困惑 我不知道如何让 Hibernate4 工作以及我的 JBoss JNDI 数据源工作 有人可以告诉我如何使 javaconfig
  • 我需要在 JFileChooser(打开模式)中显示不带扩展名的文件名。如何?

    我在打开模式下使用 JFileChooser 我需要显示不带扩展名的 文件名 字段 如何 我知道文件视图 它删除文件系统文件中的扩展名 但将所选文件中的扩展名保留在 文件名 字段中解释 http saveimg ru show image
  • 如何在 HandlerInterceptorAdapter 中添加 HttpServletRequest 标头?

    我正在尝试将授权标头添加到我的请求中 作为我们切换环境时的临时解决方法 我试图在扩展 HandlerInterceptorAdapter 的拦截器中处理它 我使用 MutableHttpServletRequest 类制作here http
  • 无法从资源加载图片

    So I am trying to load a image file from a resource so that when I export my application into a jar file it could be use
  • java setFullScreenWindow 在 Mac 中隐藏登录对话框

    我使用的是全屏窗口 类似于屏幕保护程序 使用这里的方法 GraphicsEnvironment getLocalGraphicsEnvironment getDefaultScreenDevice setFullScreenWindow t
  • Java:SortedMap、TreeMap、可比较?如何使用?

    我有一个对象列表 需要根据其中一个字段的属性进行排序 我听说 SortedMap 和 Comparator 是实现此目的的最佳方法 我是否要与正在排序的类实现 Comparable 还是创建一个新类 如何实例化 SortedMap 并传入
  • 嵌套字段的 Comparator.comparing(...)

    假设我有一个这样的域模型 class Lecture Course course getters class Course Teacher teacher int studentSize getters class Teacher int
  • Java 中 JButton 的击键/热键

    最初我使用 JMenu 并建立热键以使用加速器工作 它运行得很好 现在我想在 JButton 中实现相同的行为 但我陷入困境 这是我编写的代码 请分享您的想法 以便我可以走上正确的道路 import javax swing import j
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • HTTP 状态 405 - 此 URL java servlet 不支持 HTTP 方法 POST [重复]

    这个问题在这里已经有答案了 我无法使页面正常工作 我有要发布的表单方法和我的 servlet 实现doPost 然而 它不断地向我表明我并不支持POST方法 我只是想做一个简单的网站并将值插入到我的 MySQL 数据库中 type Stat
  • javax.media.jai 类的公共下载?

    这是一个非常简单的问题 我一直在寻找可以下载 javax media jai 库的地方 我找到了 jai imageio 库 但是我发现的所有其他 jai 内容要么已经过时 2008 年及之前 然后我遇到了登录屏幕 是否有 javax me
  • 如何从 JavaFX 中的另一个控制器类访问 UI 元素?

    我有一个使用 NetBeans 8 编写的 JavaFX Java 8 应用程序 没有SceneBuilder 我的应用程序有一个主窗口 该窗口有自己的 FXML 文件 primary fxml 和自己的控制器类 FXMLPrimaryCo
  • 如何使用自定义 JDK 构建 Jenkins 项目?

    我有一个常规的 Jenkins 实例 运行一些多分支管道 该实例在 JDK 11 上运行 因为 Jenkins 并不真正支持更高版本 没关系 但不好的是 我的所有管道似乎也都受到 Java 11 的限制 Jenkins 仅使用它自己也使用的
  • 如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

    使用 Apache commons net 的 Java FTPSClient 进行会话恢复是一个已知问题 会话恢复是 FTPS 服务器数据连接所需的一项安全功能 Apache FTPSClient 不支持会话恢复 并且 JDK API 使
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle

随机推荐

  • Tensorflow js VS Tensorflow Lite

    这是一个开放式的问题 只是很好奇 如果我想在浏览器上部署机器学习 对象检测 模型 也许首先在网络应用程序上 在手机上查看 那么当前的区别是什么 据我所知 tensorflowjs和tensorflowlite都兼容这种部署 我听说 tens
  • 查看从 FirstFragment 调用 SecondFragment 的问题

    我正在制作一个简单的演示项目Fragments 我在其中打电话SecondFragment from FirstFragment on button click 我毫无问题地调用了 SecondFragment 但是我getting vie
  • 使用 CALayer 将对角横幅/徽章添加到 UITableViewCell 的角上

    我试图在我的表格视图中绘制装饰 UITableViewCell 的文本横幅 看起来像邮票 对角线穿过单元格的左上角 我可能完全在错误的地方做这件事 但我压倒一切 layoutSubviews添加图层 我尝试这样做 drawRect 但是当表
  • 管理员重定向 保存

    如何在保存时将用户重定向到不同的应用程序 我有两个应用程序 比如说app1 and app2 如果用户单击 保存在 app2那么它应该被重定向到app1而不是默认页面 我不想做自定义表单 要在管理中保存后更改重定向目的地 您需要覆盖resp
  • 在jsp中的for循环中创建表的行

    在 jsp 中 我有一个表 我在这样的循环中创建其行 table tr th Item th th Quantity th th Price th th Total th th Actions th tr tr td td tr table
  • CSS 粘性页脚 - 带边距

    我正在尝试应用粘页脚的这种方法 http code google com p cleanstickyfooter http code google com p cleanstickyfooter 它工作得很好 但是 我有一个问题 我的特定网
  • Android - 发送 HDMI CEC 命令到电视 - minix - libCEC

    我正在开发 Minix NEO X8 H Android 媒体中心 4 4 2 我需要向电视发送 HDMI CEC 命令 当我的应用程序收到呼叫时 我想自动将电视源更改为 Minix hdmi来源 实际上 Minix 提供了一些启用 HDM
  • 正则表达式替换记事本++中的html空格和前导空格

    我尝试使用以下正则表达式来删除 html 空格和前导空格 Find s lt gt s Replace 1 但每次执行此操作时 我的文档中都会出现 186 次 1 字面意思 任何帮助将不胜感激 这是我正在谈论的一个例子 This field
  • 在选项卡栏中添加垂直线作为分隔线作为分隔线

    我有一个标签栏 我需要在标签之间放置一条垂直线作为分隔线 该怎么做 这就是我使用标签栏的方式 new TabBar unselectedLabelColor Color fromRGBO 119 119 119 1 labelColor C
  • 如何正确使用 API 数据请求的请求头?

    我正在尝试使用 httr 包找到使用 R 连接到 Appannie 的 API 的方法 完全没有 API 连接经验 API需要包含请求头 引用自 appannie 网站 注册 App Annie 帐户并生成 API 密钥 将此密钥添加到您的
  • 如果数据库被锁定,重试 SQLite 查询的最简单方法?

    我不太确定在哪里问 我希望就在这里 我寻找的是在数据库繁忙时重试 SQLite 查询的最简单的解决方案 我在服务器上使用 quassel 作为 IRC 客户端 并且希望将旧日志移至单独的数据库以保持其使用的较小规模 我为此编写的脚本是 CR
  • EqualsIgnoreCase() 未按预期工作。

    当我运行以下程序时 它仅打印 equals says they are equal 然而 从 java 8 中的 equalsIgnoreCase 文档中我们可以得到 两个字符 c1 和 c2 被认为是相同的 忽略大小写 如果 以下至少一项
  • 变体接口中的变体委托。使困惑

    早些时候我对接口的差异有了很好的理解 现在我对变体接口中委托的差异有点困惑 方法 属性 索引器和事件可以在接口中定义 变体接口中的方法 属性和索引器的签名是直接的 而事件却发生了逆转 我不明白为什么返回值方法可以在协变接口中工作 但类似的委
  • 将用户表单直接放在 Excel 工作表上

    有没有办法直接在excel工作表上插入用户表单 我们可以添加内置控件以及 activex 控件 我不明白为什么我们不能在同一工作簿中添加用户表单 Thanks 不 我认为这是不可能的 用户窗体只是保存 ActiveX 控件的容器 电子表格也
  • 批处理 - 解析 Tracert 的输出

    我想寻求有关 Windows 中 Tracert 输出的一些帮助 即我有以下输出 Tracing route to Y Y Y Y over a maximum of 30 hops 1 1 ms 1 ms 1 ms X X X X 2 1
  • freetds locale.conf,日期格式

    我正在使用 freetds 并关注manual http www freetds org userguide locales htm我可以设置日期格式 etc locale conf 我一开始就没有它 所以我手动创建了它 现在我得到这样的日
  • 如何在R中获取数组的列索引矩阵?

    想象一下 我在 R 中有一个简单的 4x3x2 数组 gt x lt array 1 24 c 4 3 2 dimnames list c a b c d c x y z 1 2 gt x 1 x y z a 1 5 9 b 2 6 10
  • 如何在邮递员中以@RequestPart形式发送数据

    我刚刚加入一个新项目 但在创建控制器中具有 RequestPart 注释的对象时遇到问题 Here are images of the model 这是控制器 和服务 我应该如何发送创建可交付对象的请求 我尝试了几种方法 但总是出现错误 请
  • HttpClient.DefaultRequestHeaders.ExpectContinue。 ExpectContinue 的用途是什么以及在什么条件下将其设置为 true 或 false。

    我已经浏览了一些代码并且遇到了 private readonly HttpClient client client new HttpClient clientHandler client DefaultRequestHeaders Expe
  • 只允许父工厂方法实例化子类

    我毫不怀疑这个问题已经在这里被问过并回答过十几次了 但我就是找不到满意的答案 我有一个类系列 我只想通过这样的静态方法由抽象父类实例化 我在这里可能有拼写错误 我正在输入但没有尝试编译 public abstract class Papa