【发布时间】:2016-01-15 10:13:52
【问题描述】:
我正在考虑实现多个 Comperators。现在我不确定如何以最有利的方式做到这一点,即仍然有能力进行依赖注入。
方法一:一类是一个比较器(见this answer):
// file LexicographicComparator.java
class LexicographicComparator implements Comparator<Person> {
@Override
public int compare(Person a, Person b) {
return a.name.compareToIgnoreCase(b.name);
}
}
// file AgeComparator.java
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person a, Person b) {
return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
}
}
方法2:现在肯定可以这样做了:
class PersonComperatorFactory {
public static Comparator<Person> getAgeComparator() {
return new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
return a.age < b.age ? -1 : a.age == b.age ? 0 : 1;
}
}
}
public static Comparator<Person> getLexicographicComparator() {
return new Comparator<Person>() {
@Override
public int compare(Person a, Person b) {
return a.name.compareToIgnoreCase(b.name);
}
}
}
}
第二种方法肯定会减少你的包的混乱(把它放到 .domain 包或 .util 包中?或者创建一个新的 .domain.comperators 包?)。但这是个好主意吗?我的意思是,除了更少的文件之外,这还有什么好处吗?代码重用或 DependencyInjection 怎么样?它可能有我还看不到的缺点吗?
我希望这不是一个“选择你最喜欢的”问题,但可能有很多充分的理由选择其中一个。
非常感谢您。
PS:你会把这个放在哪个包里(这可能是个人选择)?但这只是一个适合发表评论的附带问题。
【问题讨论】:
-
除非有充分的理由,否则我不会使用工厂类。你没有(文件少是一个荒谬的“原因”)。 KISS 原则也适用于此,从 Spring 的角度来看,如果您打算注入比较器,这也是有意义的。
-
无论谁投了反对票,请善意地解释为什么您认为这是一个愚蠢的问题。谢谢。 BTW:的确,这不是一个真正的工厂,正如我之前所说,我自己质疑“不那么杂乱”的原因。
标签: java design-patterns compare