Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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映射:使用值对象';s属性作为关键,不好的做法?_Java_Map - Fatal编程技术网

Java映射:使用值对象';s属性作为关键,不好的做法?

Java映射:使用值对象';s属性作为关键,不好的做法?,java,map,Java,Map,使用对象的属性作为贴图条目的键是否不好?每次我这么做,我都觉得不对 例如: class Foo { String name; String bar; } 然后使用这样的地图: Foo foo = new Foo(); foo.name = "foo bar"; foo.bar = "blaaaa"; Map<String, Foo> foos = new HashMap<>(); foos.add(foo.name, foo); Foo-Foo=new-Fo

使用对象的属性作为贴图条目的键是否不好?每次我这么做,我都觉得不对

例如:

class Foo {
  String name;
  String bar;
}
然后使用这样的地图:

Foo foo = new Foo();
foo.name = "foo bar";
foo.bar = "blaaaa";

Map<String, Foo> foos = new HashMap<>();
foos.add(foo.name, foo);
Foo-Foo=new-Foo();
foo.name=“foo-bar”;
foo.bar=“blaaaa”;
Map foos=新的HashMap();
添加(foo.name,foo);

感觉有点不对劲。

乍一看,感觉不对

但是使用字段作为键是合理的,可能有点多余但合法。 键的值来自哪里并不重要!因为
映射的目的是检索元素。这样做很公平

如果你感到内疚,如果没有任何副作用,你可以将该字段从类中移除

这可能是错误的-您没有对字段使用方法。考虑下面的ScEnIIO:您希望将两个字符串组合为新的键。如果你引用了一个字段一千次,那你就倒霉了!您只需替换该字段的所有出现项。如果您不小心更换了其他部件,这可能会导致错误和不便


但是如果你有一个方法,你只需改变方法中的部分,你就完成了。

这是
映射
索引查找最常见的用法之一。这里没有问题。尽管要注意,如果
Foo
是可变的,那么如果
Foo
发生变化,索引将变得不正确。如果您担心的是内存浪费,在
String
键的特殊情况下,您可以利用该池(请参阅
String.intern
的文档)在某些情况下,您可以考虑枚举而不是类来完成相同的用例,但更好/不可变。例如,您可以检查
HashSet
中是否有内容,而不是
HashMap
,这将消除这个特别的问题(尽管我同意这不是一个需要关注的问题)。最后两段(对我来说)不是很清楚。我总是使用方法,只是使用字段作为一个快速示例。无论如何,谢谢!:)