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();`