- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些这样的 Java 枚举
public enum Aggregation
{
MORTGAGE( "Mortgage" ),
POOLS( "Pools" ),
PORTFOLIO( "Portfolio" );
private Aggregation( final String name )
{
m_Name = name;
}
private String m_Name;
static Map< String, Aggregation > c_LOOKUP =
new HashMap< String, Aggregation >();
static {
for (Aggregation agg:values()){
c_LOOKUP.put(agg.m_Name,agg);
}
}
public Aggregation lookup(String name){
return c_LOOKUP.get( name );
}
@Override
public String toString()
{
return m_Name;
}
}
public enum Interval
{
MONTHLY( "Monthly" ),
QUARTLY( "Quartly" ),
SEMIANNUALLY( "SemiAnnually" ),
ANNUALLY("Annually");
private Interval( final String name )
{
m_Name = name;
}
private String m_Name;
static Map< String, Interval > c_LOOKUP =
new HashMap< String, Interval >();
static {
for (Interval agg:values()){
c_LOOKUP.put(agg.m_Name,agg);
}
}
public Interval lookup(String name){
return c_LOOKUP.get( name );
}
@Override
public String toString()
{
return m_Name;
}
}
如您所见,这里有相当多的代码重复。如果有一种方法可以引入类似抽象公共(public)祖先类的东西,那就太好了。但是java enum不能固有。最好的方法是什么?谢谢。
编辑:我已经制定了一个类似于 ŁukaszBachman 和 missingfacktor 的版本
static public enum Aggregation
{
MORTGAGE( "Mortgage" ),
POOLS( "Pools" ),
PORTFOLIO( "Portfolio" );
private final String m_Name;
final static private ReverseDictionary< Aggregation > c_DICTIONARY =
new ReverseDictionary< Aggregation >( Aggregation.class );
static public Aggregation lookup( final String name )
{
return c_DICTIONARY.lookup( name );
}
private Aggregation( final String name )
{
m_Name = name;
}
@Override
public String toString()
{
return m_Name;
}
}
static public enum Interval
{
MONTHLY( "Monthly" ),
QUARTLY( "Quartly" ),
SEMIANNUALLY( "SemiAnnually" ),
ANNUALLY( "Annually" );
private final String m_Name;
final static private ReverseDictionary< Interval > c_DICTIONARY =
new ReverseDictionary< Interval >( Interval.class );
static public Interval lookup( final String name )
{
return c_DICTIONARY.lookup( name );
}
private Interval( final String name )
{
m_Name = name;
}
@Override
public String toString()
{
return m_Name;
}
}
static public class ReverseDictionary< E extends Enum< E >>
{
Map< String, E > c_LOOKUP = new HashMap< String, E >();
public ReverseDictionary( final Class< E > enumClass )
{
for( final E agg : EnumSet.allOf( enumClass ) )
{
c_LOOKUP.put( agg.toString(), agg );
}
}
public E lookup( final String name )
{
return c_LOOKUP.get( name );
}
}
我看到了一些推理。然而,它仍然不是很令人满意。
lookup(String)
返回类型不同,很难定义接口(interface)lookup(String)
并不是真正的重复,而是一种规范,但我仍然觉得 m_Name 字段和 toString() 逻辑有点多余。我们实际上是在指定一类枚举,在我看来它似乎是“is-a”关系。 最佳答案
倾向于组合而不是继承和为了接口(interface)而编程。由于枚举是类(不是常规的,但仍然是类),您可以创建一些包含共享逻辑的字段,让枚举实现您的接口(interface)并将实现委托(delegate)给该字段。
相关代码片段:
共享接口(interface)
public interface MyInterface {
void someMethod();
}
逻辑实现
public class MyInterfaceImpl implements MyInterface {
public void someMethod() {
System.out.println("Do smth...");
}
}
第一个枚举
public enum EnumA implements MyInterface {
;
private MyInterface impl = new MyInterfaceImpl();
public void someMethod() {
impl.someMethod();
}
}
第二个枚举
public enum EnumB implements MyInterface {
;
private MyInterface impl = new MyInterfaceImpl();
public void someMethod() {
impl.someMethod();
}
}
请注意 EnumA
和 EnumB
并不是真正的代码重复,因为那是简单的委托(delegate)(在我看来是有效的)。另请注意,所有内容都通过使用界面很好地粘合在一起。
关于java - 如何为几个 Java 枚举添加常用方法? (抽象类的祖先?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163968/
我正在尝试构建一个页面大小三分之一的容器,但我收到错误 No MediaQuery ancestor could be found starting from the context that was
给定包含数据的表T_Person(姓名,父级) +--------+--------+| name | parent |+--------+--------+| john | peter |
假设输入 XML 为 Test Me 我想找到 title 和 author 的最低共同祖先。我在 BaseX 中尝试了以下代码: let $p := doc('t.xq
给定表 T_Person(姓名, parent ) 包含数据 +--------+--------+| name | parent |+--------+--------+| john | p
我在leetcode中找到了java中最低公共(public)祖先问题的解决方案。换句话说,问题是找到 p 和 q 的最低共同祖先,并且 BST 的根为根。这是我的代码。 public TreeNod
我知道如果这两个节点必须在二叉树中如何解决问题,但是如果它们不必在树中怎么办?如果树中只有一个或没有这些节点,则返回 None。 这是我的代码: # Definition for a binary t
我在 stackoverflow 上查看了很多其他答案,但找不到任何有效的东西,我要么得到根,要么返回 node1 本身,我不知道如何递归地执行此操作,并且已经尝试了很多次一切都以同样的方式结束。任何
如果所有元素都不同,则很容易在 BST 中找到最近的共同祖先。但是,如果某些值相同怎么办。到目前为止,我们只是比较节点的数据,仅此而已,但现在我们是否需要检查节点的地址而不仅仅是值? 最佳答案 是的,
问题:给定一个二叉搜索树 (BST),找到 BST 中两个给定节点的最低公共(public)祖先 (LCA)。 根据维基百科上 LCA 的定义:“最低公共(public)祖先定义在两个节点 v 和 w
我正在尝试通过自上而下的递归来解决二叉树的最低公共(public)祖先(LCA)问题。 我使用的方法是: IDEA: Find the node which has one of the desire
我被这个问题绊倒了。以下是我的做法: Lets say the two nodes are node1 and node2 For any node (lets say node1), find th
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
只是想知道以下算法在二叉搜索树中查找两个节点的最低公共(public)祖先的效率如何。 Node getLowestCommonAncestor (Node root, Node a, Node b)
如果我知道树中每个节点的邻接列表,那么如何找出该树中存在的任意两个节点的最低公共(public)祖先? 其实我想找出任意两个节点之间的距离,所以我想计算 LCA。有没有办法从邻接表中计算出来? T 中
这里的二叉树不一定是二叉搜索树。 该结构可以视为 - struct node { int data; struct node *left; struct node *right
以下是我对二叉搜索树的最低公共(public)祖先的实现。我有两个问题: 1) 时间复杂度为 O(n),空间复杂度为 O(n) 最坏情况,但如果 BST 平衡,时间和空间的平均情况为 O(logn)。
这是一个很受欢迎的面试问题,我能找到的关于该主题的唯一一篇文章来自 TopCoder .不幸的是,从面试答案的角度来看,它看起来过于复杂。 除了绘制到两个节点的路径并推导祖先之外,是否有更简单的方法来
我在面试中被问到这个问题,虽然我知道如何解决这个问题,但我没有回答。我不知道该怎么做的原因是因为问题是这样给我的: class Node{ int val; Node *lef
我正在尝试提出获取上下文项的所有祖先的解决方案。一种选择是将 _path 存储在索引中,另一种选择是执行类似于以下操作的操作: http://www.glass.lu/Blog/GettingAnce
我正在尝试用java实现n叉树中多个节点的LCA。我正在处理句子的解析树,因此假设节点的子节点数 <= 6 是合理的。这里的多个节点是句子中的两个短语(连续单词序列)。令 k 为涉及的节点数。 一种方
我是一名优秀的程序员,十分优秀!