从hashmap构造类

iqjalb3h  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(285)

我想编写一个构造函数来设置hashmap中的值。你能告诉我最好的方法是什么吗?
我现在使用switch语句调用基于hashmap键的方法,但我想知道是否有更好的替代方法。
仅供参考,在myitems类中,我实际上有25个变量要设置。

public class MainClass{
    BufferedReader br = new BufferedReader(new FileReader(file));
    String[] datakey = br.readLine().split(";"); // getting header, 25 of them
    HashMap<String,String> bookmap = new HashMap<String,String>();
    String[] dataarr = line.split(";"); // getting values, 25 of them
    int k = 0;
    for(String d : datakey){
        bookmap.put(d, dataarr[k++]); // Key-Value Pair
    }
    myItems item = new myItems(bookmap); // HOW TO WRITE THIS CONSTRUCTOR?
}

public class myItems {
    String _id="";
    String _name="";
    String _genre="";
    String _language="";
    int _rating=0;
    int _price=0;
    ...........................
    ...//25 OF THEM...
    ...........................

    public myItems(HashMap<String,String> allrec){
        Iterator<Map.Entry<String,String>> it = allrec.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry pairs = (Map.Entry)it.next();
            Switch(pairs.getKey()){
                case "id":
                    setid(pairs.getValue());
                    break;
                case "name":
                    setname(pairs.getValue());
                    break;
                Deafult:
                    break;
            }
        }
    }

    public int getid(){
        return this._id;
    }
    public String getname(){
        return this._name;
    }
    ..............................
    ..............................
    ..............................

    public void setid(int id){
        this._id = id;
    }
    public void setname(String name){
        this._name = name;
    }
    ..............................
    ..............................
    ..............................
}
jm2pwxwz

jm2pwxwz1#

你为什么不这样写呢:

public myItems(HashMap<String,String> allrec){
    setid(allrec.get("id");
    setname(allrec.get("name");
}

如果不希望为任何属性分配null值,则应检查Map是否返回null:

public myItems(HashMap<String,String> allrec){
    String id = allrec.get(id);
    if(id != null)
            setid(id);
    // ...
}

你的问题其实还有另一个解决办法。为什么还要费心把这些值存储在属性中呢?你可以把它们储存在Map上。您的构造函数如下所示:

private Map<String, String> mAttributes;
public myItems(HashMap<String, String> allrec) {
       mAttributes = allrec; 
}

请注意,您应该考虑复制整个Map,而不是像上面那样存储引用。然后编写如下集合方法:

public void setId(String id) {
        mAttributes.put("id", id);
}

你的get方法是这样的:

public String getId() {
        return mAttributes.get("id");
}
nsc4cvqm

nsc4cvqm2#

你可以用反射。想象一下,有些字段有setter(对于数据结构来说是可以的,对于类来说是可疑的——那么可变性和不可变性呢?),而其他字段没有。然后你可以这样做:

import java.lang.reflect.Method;

public void setAll(final Map<String, String> fieldMap) {
    for (final Map.Entry<String, String> entry : fieldMap.entrySet())
        setField(entry);
}
public void setField(final Map.Entry<String, String> entry) {
    setField(entry.getKey(), entry.getValue());
}
public void setField(final String name, final String value) {
    final Method fieldSetter = getFieldSetter(name);
    if (fieldSetter != null) {
        fieldSetter.invoke(this, value);
        return;
    }
    final Field field = getField(name);
    if (field != null) {
        field.set(this, value);
        return;
    }
    // Throw some exception
}
public Method getFieldSetter(final String fieldName) {
    return getMethod(getSetterName(fieldName));
}
public static String getSetterName(final String fieldName) {
    return "set" + upperCaseFirst(fieldName);
}
public static String upperCaseFirst(final String s) {
    return Character.toUpperCase(s.charAt(0)) + s.substring(1);
}
public Method getMethod(final String methodName) {
    final Class<?> clazz = getClass();
    try {
        return clazz.getMethod(methodName, String.class);
    } catch (final NoSuchMethodException ignore) { }
    try {
        return clazz.getDeclaredMethod(methodName, String.class);
    } catch (final NoSuchMethodException ignore) { }
    return null;
}
public Field getField(final String fieldName) {
    final Class<?> clazz = getClass();
    try {
        return clazz.getField(fieldName);
    } catch (final NoSuchFieldException ignore) { }
    try {
        return clazz.getDeclaredField(fieldName);
    } catch (final NoSuchFieldException ignore) { }
    return null;
}

有一些异常需要处理,您需要相应地更改源代码。
android reflection上的afair将受到性能惩罚。您可能需要关注该方法的性能。

相关问题