为什么提供私有的构造器能保证一个类只有一个实例(有待深入)

1.在我们新建一个类的对象的时候,构造器创建对象后会自动被调用,发生在其他类成员被设置为默认初始值之后,当然如果有字段初始器和初始化块的话,构造器的调用会发生在此之后。构造器的主要作用是在new将对象的引用返回之前初始化对象。

2.其访问权限是private,于是它只能被包含它的类自身所访问,而无法在类的外部调用,故而可以阻止对象的生成。所以,如果一个类只有一个私有构造器,而没有任何公有构造器,是无法生成任何对象的。

3.那么无法生成对象的带有私有构造器的类究竟有什么作用呢?这样的类在实际应用中最常用的是作为工具类,如字符串的验证、枚举转换之类的,通常只做成静态接口被外部调用即可。这里先插入一点关于静态方法的说明。静态方法是用static关键字声明的方法,可以用类来直接调用而无需用从类中实例化出来的具体对象来调用,因此这样的方法也被称为类方法。

4.那么在外部使用的时候,只需要通过类名,而不是对象实例来调用validataString方法,如A.validataString(str);可以直接调用此方法。阻止生成对象可以防止不可预期的结果。

原文地址:https://www.cnblogs.com/wzdnwyyu/p/11082215.html

时间: 2024-11-10 15:46:13

为什么提供私有的构造器能保证一个类只有一个实例(有待深入)的相关文章

如何保证一个类中的实例变量不被改变

如题,如果在一个对象中的实例属性不能被改变,需要设置成不可变量的时候采用如下方法:1.将类定义成final类型 2.将实例变量定义成final类型 3.将实例变量的set方法去除 4.将在构造方法中克隆一份数据设置给实例变量 5.将在get方法中将实例变量克隆一份赋值返回给用户 public final class Demo{ private final Date start; private final Date end; public Demo(Date start,Date end){ t

Spring用@Autowire向一个类注入一个接口的两个实现类

@Servicepublic class AaaService implements IChangePassword { @Override public void changePassword(String username, String password) { } } @Servicepublic class BbbService implements IChangePassword { @Override public void changePassword(String usernam

设计一个类,我们只能生成该类的一个实例。

    单例模式的要点有三个:一是某个类只能有一个实例:二是它必须自行创建这个实例:三是它必须自行向整个系统提供这个实例. 从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象. #include<iostream> #include<stdlib.h> using namespace std; class Csingleton { private: Cs

如何保证一个类在内存中的对象唯一性?

我发现就算同一个答案,但提问的方式不同, 往往会对回答造成干扰或者影响, 貌似高考的时候老师也说过差不多的话, 如果这题目是问:请描述单例设计模式的实现步骤,那估计就能答出来了. 解决的问题:保证一个类在内存中的对象唯一性. 比如:多程序读取一个配置文件时,建议配置文件封装成对象. 会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象, 就需要该配置文件对象在内存中是唯一的.Runtime()方法就是单例设计模式进行设计的. 如何保证对象唯一性呢? 思想:1,不让其他程序创建该类对象.

反射获取一个类的私有方法

今天在刷面试题的时候,发现一个题目是编写程序通过反射获取一个类的私有方法,因为之前学反射的时候也学的浅,没有考虑到这样的事情.今天敲了一下,虽然也就是那么几行代码,还是磕磕绊绊的,最后终于搞定了,这里总结一下 Java反射得到一个类的私有方法 获得私有方法的流程是 (1)获取目标类 (2)获取目标方法 Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法) Method method=clazz.getMeth

在C#中我们能调用一个类的私有方法吗

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)

同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了. 两者的区别主要体现在同步锁上面.对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象): 有几个原则的:程序次序规则:一个线程内,代码的执行会按照程序书写的顺序

如何让一个类不能被实例化

本文涉及的概念: 1.在面向对象编程中,在什么场景下会需要做到让一个类不能被实例化 2.让一个类不能被实例化的方法 什么样的场景会需要让一个类不能被实例化 工具类(utility class),实例化对它们没有意义的工具类.这时候,就要做到不让该类被实例化 java.lang.Math: 把与Math相关的基本类型的值和相关的方法组合到该Math类中.Math类不需要实例化,使用了私有构造器.不过,它可以在Math类中内部被实例化. 使用私有构造器,没有子类;使用final修饰,没有子类. pa

java.lang.reflection打印一个类的全部信息

package com.ljy.chapter5; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Scanner; /** * This program uses reflection to print all features of