代码之家  ›  专栏  ›  技术社区  ›  JSBach

从set<typea>解析到set<typeb>

  •  1
  • JSBach  · 技术社区  · 14 年前

    我有个奇怪的问题,希望有人能帮我。 我使用Java。

    我收到一套方法。这个类型正是我想要的,但是我想在它上面添加更多的功能,以提高代码的清洁度。

    在C++中,我可以编写扩展方法,但是我不认为Java有这样的东西,所以我想创建一个新的类型,TypeB,它包含一个Type变量,并执行我想要的额外函数(像包装器/适配器)。但问题是:

    我做不到

    Set<TypeB> mySet = myMethod();
    

    Set<TypeB> mySet = (Set<TypeB>)myMethod();
    

    最完美的就是这样

    Set<TypeB> mySet = new Set<TypeB>(myMethod());
    

    但是SET是Java类型,所以我不能向它添加构造函数。

    我该怎么做才能清晰地分析它呢? 如果我添加一个方法

    Set<TypeB> mySet = parse(myMethod());
    

    我将不得不遍历mymethod中的所有项,这不会非常具有性能。

    有没有比创建这个方法更好的解决方案?

    谢谢, 奥斯卡

    3 回复  |  直到 14 年前
        1
  •  4
  •   luqui    14 年前

    如果您添加的功能不是继承typea,而是使用函数(静态方法),该怎么办?

    因此,而不是:

    public class TypeB {
        TypeA self;
        public void Frobnicate(int foo) {...}
    }
    

    写:

    public class TypeAUtils {
        public static void Frobnicate(TypeA self, int foo) {...}
    }
    

    C无论如何,扩展方法只是这种技术的语法糖。

    这是我最喜欢的设计图案之一。我称之为“功能”,它被高度低估了。-P

    如果不能这样做(因此也不能使用扩展方法),那么必须向typea添加状态,在这种情况下,必须为集合中的每个对象分配更多的内存,这意味着不能避免迭代。

        2
  •  2
  •   Stan Kurilin    14 年前

    只有这样的SMT

    Set<TypeB> parse(Set<TypeA> old){
       Set<TypeB> res = new HashSet<TypeB>();
       for(TypeA a : old) res.add(new TypeB(a));
       return res;
    }
    

    或者创建自己的集合。

        3
  •  1
  •   Stephen C    14 年前

    编辑

    (根据下文运营商的澄清意见进行修订。)

    让我们假设一下 B 有一个构造函数

        public B(A a) { ... }
    

    创建一个 适应一个 A 实例。然后最简单的方法创建一个 Set<B> 从A Set<A> 是:

        Set<A> aset = ...
        Set<B> bset = new HashSet<B>(aset.size());
        for (A a : aset) {
            bset.add(new B(a));
        }
    

    ApacheCommons集合和Guava集合包括一些基础设施,这些基础设施可以将一个类的集合转换为另一个类的集合,但是对于这样简单的事情来说,这些基础设施可能是多余的。(但是如果你真的想走这条路,那么guava会更好,因为这些API都知道泛型。)