小编典典

是的,构造函数可以是私有的。有不同的用途。一种这样的用法是用于单例设计反模式,我建议你不要使用它。另一个更合理的用法是委派构造函数。你可以让一个构造函数接受很多不同的选项,而这些选项实际上是实现细节,因此你将其设为私有,但是其余的构造函数将委托给它。

作为委派构造函数的示例,以下类允许你保存值和类型,但仅允许你对类型的子集进行保存,因此需要将常规构造函数设为私有以确保仅使用允许的类型。通用私有构造函数有助于代码重用。

public class MyClass {

private final String value;

private final String type;

public MyClass(int x){

this(Integer.toString(x), "int");

}

public MyClass(boolean x){

this(Boolean.toString(x), "boolean");

}

public String toString(){

return value;

}

public String getType(){

return type;

}

private MyClass(String value, String type){

this.value = value;

this.type = type;

}

}

编辑

回顾几年后的答案,我想指出,这个答案既不完整,又有些极端。单例确实是一种反模式,应尽可能避免使用单例。但是,除了单例之外,私有构造函数还有很多用途,我的答案仅列举了一个。

再举几个使用私有构造函数的情况:

要创建一个无法实例化的类,它只是相关静态函数的集合(这基本上是一个单例,但是如果它是无状态的并且静态函数严格地对参数进行操作而不是对类状态进行操作,那么这不是像我这样不合理的方法。虽然使用实现依赖注入的接口通常可以使实现(在实现需要大量依赖或其他形式的上下文时)维护API更加容易,但似乎更早提出建议。

当有多个不同的方式来创建对象,一个私有的构造可能更容易理解其构建方式的不同(例如,这将更加有可读性,你new ArrayList(5)还是ArrayList.createWithCapacity(5),ArrayList.createWithContents(5),ArrayList.createWithInitialSize(5))。换句话说,私有构造函数允许你提供名称更易于理解的工厂函数,然后将构造函数私有化可确保人们仅使用更不言自明的名称。这也通常与构建器模式一起使用。例如:

MyClass myVar = MyClass

.newBuilder()

.setOption1(option1)

.setOption2(option2)

.build();

2020-03-21

java构造方法可以是私有的吗_Java中的构造函数可以私有吗?相关推荐

  1. getvalue函数怎么使用_Java中的构造函数——通过示例学习Java编程(14)

    作者:CHAITANYA SINGH 来源:通过示例学习Java编程(14):Java中的构造函数-方家话题 构造函数是用来初始化新创建的对象的代码块.构造函数类似于java中的实例方法(Instan ...

  2. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  3. java 继承 实现 会重写 方法吗_java 中继承,组合,重载,重写的实现原理 (转)...

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  4. Java所有函数都是动态的_Java中的函数动态调用

    //------------------------------------- //类ArgumentHolder //用于调用参数的封装,实现变长参数及 //不同类型参数的统一形式地传递 //成员变 ...

  5. java构造函数的重载_Java中的构造函数重载 - Break易站

    Java 构造函数 Java中的构造函数重载 除了重载方法外,我们还可以在java中重载构造函数.基于新执行时指定的参数调用重载的构造函数. 我们什么时候需要构造函数重载? 有时候需要用不同的方式初始 ...

  6. java.lang类在电脑哪个位置_Java中的java.lang.Class API 详解

    且将新火试新茶,诗酒趁年华. 概述 Class是一个位于java.lang包下面的一个类,在Java中每个类实例都有对应的Class对象.类对象是由Java虚拟机(JVM)自动构造的. Class类的 ...

  7. java bufferedwriter会自动创建文件吗_Java中为什么会有包装类?自动拆装箱必要吗?关于Wrapping Class这是重点!...

    入题 自动封箱与拆箱人人皆可言之道之,但封箱和拆箱却被多数人略之!如此简单的一个机制,却影射着Java的核心理念,不清楚?继续向下看吧~ Java中的数据类别 目前Java中的数据类别分为两种,一种是 ...

  8. 用java的io做一个代码计数器_Java中的程序计数器是什么

    Java中的程序计数器是什么 程序计数器是当前线程正在执行的字节码的地址.程序计数器是线程隔离的,每一个线程在工作的时候都有一个独立的计数器. JAVA虚拟机管理的内存区域图 1.什么是程序计数器? ...

  9. java static关键字的作用是什么_java中的static关键字

    一.static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中static表示"全局"或者 ...

最新文章

  1. 损失函数/成本函数/目标函数的区别
  2. 第三章 学习ICE 3.0--Slice语言
  3. HDU-3280 Equal Sum Partitions
  4. C#中搜索关键词高亮显示
  5. 再读TCP/IP网络7层协议
  6. oracle杀死进程时权限不足_如何解决Oracle数据库在迁移过程中的权限不足问题
  7. Neural Architecture Search(NAS)强化学习寻找最优网络、NASNet、MNASNet
  8. pycharm windows 如何导入github仓库的项目代码
  9. iOS开发常用的RGB色值
  10. day 0150面向对象-成员
  11. centos7.4源码安装nginx-1.16.1 及NGINX最全配置 缓存缩略图4层转发
  12. 关于MAPGIS文件转CAD文件的问题处理
  13. 实验八 Python文件处理
  14. UWP学习(一)--Talking about 5 Controls
  15. 电脑播放视频报错----------无法播放。请确保你的计算机的声卡和视频卡可以使用,并安装了最新的驱动程序----------解决!
  16. 腾讯云部署Hebe节点教程
  17. 让Android Studio项目通过阿里云 代理加速下载依赖资源
  18. word转换成excel导致身份证错乱的解决办法
  19. #include NOIP2008 Junior 双栈排序 ——using namespace wxl;
  20. java三种循环的流程图画法总结(for,while,do-while循环)

热门文章

  1. Android现学现用第十二天
  2. golang中值类型/指针类型的变量区别总结
  3. bzoj 3209 花神的数论题 —— 数位DP
  4. [TimLinux] JavaScript AJAX接收到的数据转换为JSON格式
  5. scala中的数组的转换操作
  6. 080 HBase的属性
  7. Linux下shellcode编写
  8. JS+CSS实现Dock menu(MacOS菜单导航效果)
  9. [WPF自定义控件库]自定义Expander
  10. javaScript 对象访问属性的另一种方式