Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我不需要实例化NumberFormat类的对象呢?_Java_Static - Fatal编程技术网

Java 为什么我不需要实例化NumberFormat类的对象呢?

Java 为什么我不需要实例化NumberFormat类的对象呢?,java,static,Java,Static,我在使用NumberFormat类。我想我必须做一些事情,比如: NumberFormat currency= new NumberFormat(); currency.getCurrencyInstance(); 但事实并非如此。这甚至是不可能的? 相反,我必须做到以下几点: NumberFormat currency = NumberFormat.getCurrencyInstance(); 为什么会这样,有什么区别呢?这是因为NumberFormat实例被重用了。事实上,对于给定的区

我在使用
NumberFormat
类。我想我必须做一些事情,比如:

NumberFormat currency= new NumberFormat();
currency.getCurrencyInstance(); 
但事实并非如此。这甚至是不可能的? 相反,我必须做到以下几点:

NumberFormat currency = NumberFormat.getCurrencyInstance();

为什么会这样,有什么区别呢?

这是因为
NumberFormat
实例被重用了。事实上,对于给定的区域设置,您只有一个
NumberFormat
对象。这是作为性能优化来完成的。你可以看一看更深刻的理解

如果多次调用
getCurrencyInstance
,每次都会得到相同的对象:

currency1 = NumberFormat.getCurrencyInstance();
currency2 = NumberFormat.getCurrencyInstance();
System.out.println("The same object? : " + (currency1 == currency2)); // true

不能使用
new
实例化
NumberFormat
对象,因为它是一个
抽象类。抽象类仅用于继承,不能实例化
抽象类的对象

引用

NumberFormat是所有数字格式的抽象基类。此类提供用于格式化和解析数字的接口。NumberFormat还提供了确定哪些区域设置具有数字格式及其名称的方法

要根据您的区域设置获取具体的format类对象,您需要使用factory类方法(这是一种设计模式)


另外,请注意NumberFormat不是线程安全的。因此,始终创建一个单独的格式实例(在并发的情况下可以在外部同步)。

实际上,如果运行下面的代码,您会发现在大多数JVM上它都失败了

`assert NumberFormat.getInstance() == NumberFormat.getInstance();`
诀窍在于,如果您只解析几个数字,那么创建一个新的NumberFormat对象并不是什么大问题,因此这是几乎所有新Java程序员都可以使用的最佳模式

但是,这是一个很大的问题,但是,如果您正在进行任何类型的大规模解析项目,那么为了提高效率,您将需要重用NumberFormat类


由于NumberFormat不是线程安全的,因此最简单的方法是使用一个util类将NumberFormat存储在ThreadLocal变量中。

什么是语言?抱歉,语言是Java,除非您认为实例化任何内容的唯一方法是使用
new
NumberFormat nf = NumberFormat.getInstance();//Gives you current locale's concrete class object
`assert NumberFormat.getInstance() == NumberFormat.getInstance();`