在有效Java中,它提到“与构造函数不同,静态工厂方法不需要在每次调用时创建新对象”。
class Car{
String color;
Boolean spoiler;
public Car(String s){
color=s;
spoiler = false;
}
public static Car redCar(){
return new Car("red");
}
}
在主类中:
Car c2 = Car.redCar();
Car c3 = Car.redCar();
C2 和 C3 是不同的对象。我没有得到“每次调用时都不需要创建新对象”的上下文。
和所有事情一样,程序完全按照你的要求去做。如果静态方法每次被调用时都使用“new ”;然后每次都创建新对象。
< code >与构造函数不同,静态工厂方法不需要在每次被调用时都创建一个新对象的意思是,您的代码可以决定不调用new;但是例如返回一个“缓存”对象。
意思:当你使用“new”时;调用构造函数;Java的语义导致了新对象的创建。没有办法阻止had,这是语言固有的。
但是,当您使用静态方法时,您需要定义该方法的语义。
“与构造函数不同,静态工厂方法不需要在每次调用时创建新对象”。这并不意味着调用静态工厂方法必然会返回相同的对象(如您的示例所示),只是可能会返回(与构造函数不同)。
例如,您可以以不同的方式实现redCar()
,以便它始终返回相同的对象:
class Car{
/* snipped */
private static final RED = new Car("red");
public static Car redCar(){
return RED;
}
}
因为你就是这样做的:
public static Car redCar(){
return new Car("red");
}
// ^ here
如果要返回相同的值,可以执行以下操作:
private static final Car RED_CAR = new Car("red");
public static Car redCar(){
return RED_CAR;
}
关键是调用< code>new Car()将总是返回一个新的实例。调用< code>Car.newInstance()意味着< code>Car类可以决定做什么。
例如:
private static final Map<String, Car> CARS = new HashMap<>();
public static Car newInstance(final String colour){
return CARS.computeIfAbsent(colour, Car::new);
}
这使用了Car
构造函数作为方法引用,引用新的Map.compute如果没有该颜色的
Car
方法,则调用它。这是一个简单的(不是线程安全的)缓存实现。
所以:
final Car one = Car.newInstance("red");
final Car two = Car.newInstance("red");
System.out.println(one == two) // true
问题内容: 我正在学习“ 有效的Java” ,书中并未建议我认为一些标准的东西,例如对象的创建,我的印象是构造函数是最好的方法,书中说我们应该利用在静态工厂方法中,我不能说出一些优点,而在缺点中却有缺点,所以我在问这个问题,这是使用它的好处。 优点: 静态工厂方法的一个优点是,与构造函数不同,它们具有名称。 静态工厂方法的第二个优点是,与构造函数不同,不需要每次调用它们时都创建一个新对象。 静态工
我的Hibernate查询SessionFactory sessionFactory=new Configuration(). confiure(). buildSessionFactory(); sess=sessionFactory.openSession()有问题;我在每个函数中都调用它,我如何避免它只创建一次sessionFactory
我有以下ThreadPoolTaskExecator2配置 在我的公共类AdminService中,我有两个方法。 void triggerJob() 布尔执行sql(字符串sql) 如何将ThreadPoolTaskExecutor插入triggerJob方法,以便在第一个方法中调用executeSql时创建新线程。 在triggerjob中,我有一个基于条件调用executeSql的循环。 我
问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得
我想编写一些使用JUnit4.12、Mockito1.9.5和PowerMock1.6.1的单元测试。这个类有一些用@mock注释的字段,还有一些用@injectmocks注释的字段。用@InjectMocks注释的属性在某个点到达一个父构造函数,该父构造函数包含一些静态方法调用,应该用PowerMock来模拟。问题是第一个测试是无缝工作的,而第二个测试似乎根本没有嘲弄静态方法。 如前所述,第一个
问题内容: 每次调用时,React都会重新渲染所有组件和子组件吗? 如果是这样,为什么?我以为这个想法是,当状态改变时,React只能渲染所需的内容。 在下面的简单示例中,尽管onClick处理程序始终将设置为相同的值,但是在随后的单击中状态不会改变,这两个类都在单击文本时再次呈现。 我曾希望只有在数据更改的情况下才会进行渲染。 这是示例代码,例如JS Fiddle和嵌入式代码段: 问题答案: 每
在Java中是否有一个静态工厂方法来创建队列? 或 但无法找到对队列(或出队列)进行同样操作的方便方法。我找到的唯一解决办法是:
问题内容: 首先,如果这是一个非常愚蠢的问题,请原谅我,我只是想学习这种语言的核心。我正在阅读《有效的Java》,并且第一章讨论了静态工厂方法与构造方法。他们的利弊。令我困惑的几件事是: 静态工厂方法返回的对象的类是非公共的 -究竟是什么意思? 与构造函数不同,每次调用静态工厂方法都不需要创建新对象 -这是怎么发生的?我仅调用工厂方法来获取新对象,是否将检查方法放入工厂方法中以检查对象是否已存在?