typ*_*ror 5 java android actionscript-3
我来自Actionscript3背景,这是我第一次在我的生活中编写任何Java.Hashtables似乎与Flash中的Dictionaries类似,但我想确保我正确使用它们.我相信Hashtable的类型是接受字符串作为键和字体作为对象.它是否正确?是否有一个不同的Collection子类更适合这样的东西?无论如何,请撕掉我的n00b Java.我需要学习这个.
package com.typeoneerror.apps.app_name.utils;
import android.content.Context;
import android.graphics.Typeface;
import java.util.Hashtable;
public class FontRegistry
{
private static FontRegistry _instance;
private Context _context;
private Hashtable<String, Typeface> _fonts;
private FontRegistry()
{
_fonts = new Hashtable<String, Typeface>();
}
public static FontRegistry getInstance()
{
if (_instance == null)
{
_instance = new FontRegistry();
}
return _instance;
}
public void init(Context context)
{
_context = context;
}
public Typeface getTypeface(int resourceId)
{
String fontName = _context.getResources().getString(resourceId);
if (!_fonts.containsKey(fontName))
{
String fontPath = "fonts/" + fontName;
Typeface typeface = Typeface.createFromAsset(_context.getAssets(), fontPath);
_fonts.put(fontName, typeface);
}
return (Typeface)_fonts.get(fontName);
}
}
Run Code Online (Sandbox Code Playgroud)
给你两个建议.
首先,变量类型应该引用Map的接口.这为您的未来提供了更大的灵活性,并且可以与大多数其他Java开发人员更好地融合.
其次,实现应该是HashMap,而不是HashTable.HashTable会同步所有内容,而HashMap则不会.
如果您确实需要多线程访问,我建议使用ConcurrentHashMap而不是HashTable.ConcurrentHashMap执行得更好,因为它在访问期间不会锁定整个地图.
所以,
private Map<String, Typeface> _fonts;
Run Code Online (Sandbox Code Playgroud)
和
_fonts = new HashMap<String, Typeface>();
Run Code Online (Sandbox Code Playgroud)
最后,许多Java开发人员更愿意不使用下划线启动成员变量.虽然这是一个有争议的偏好.
编辑:最后的挑剔.您似乎使用单例模式进行注册表.这可能会在以后咬你,所以考虑避免单身人士http://accu.org/index.php/journals/337.但是,忽略这一点,你可能最好在声明中实例化单例静态实例.它可以避免第一次获取时可能发生的争用.
所以:
private static FontRegistry _instance = new FontRegistry;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
306 次 |
| 最近记录: |