【问题标题】:Generic configuration of unknown subtypes with differing getters setters具有不同 getter setter 的未知子类型的通用配置
【发布时间】:2011-12-10 14:20:30
【问题描述】:

我希望能够为一堆相关但不同的类读取和写入(获取和设置)某些字段,而无需知道它们究竟是什么类型的具体类。我所知道的是,它们有一些我希望能够通用访问和修改的参数类型。鉴于我不知道该类是什么具体类型,我也不知道每个类的具体参数类型是什么。

  • 我认为以下方法可行,但它是否足够好/可能存在什么问题?
  • 或者对于这个问题有更好的方法/甚至是既定的设计模式?

允许通用配置的超类

public abstract class ParametrizerBase<P1, P2> {
    public P1 Param1;
    public P2 Param2;
}

需要特定参数的具体类

public class SomeConcreteClass extends ParametrizerBase<Boolean, String> {
    public SomeConcreteClass(Boolean enabled, String task){
        Param1 = enabled;
        Param2 = task;
    }
    // ... does something with the parameter data
}

另一个具有不同数据类型的具体类

public class AnotherConcreteClass extends ParametrizerBase<Integer, Date> {
    public AnotherConcreteClass(Integer numberOfItems, Date when){
        Param1 = numberOfItems;
        Param2 = when;
    }
    // ... does something with the data it holds
}

示例用法

    ArrayList<ParametrizerBase> list;

    public void initSomewhere() {
        SomeConcreteClass some = new SomeConcreteClass(true,"Smth");
        AnotherConcreteClass another = new AnotherConcreteClass(5, new Date());
        list = new ArrayList<ParametrizerBase>();
        list.add(some);
        list.add(another);
    }

    public void provideDataElsewhere() {
        for (ParametrizerBase concrete : list) {
            String param1Type = concrete.Param1.getClass().getName();
            if (param1Type.contains("Boolean")) {
                 Boolean value = concrete.Param1;
                 // Now could let user modify this Boolean with a checkbox 
                 // and if they do modify, then write it to concrete.Param1 = ...
                 // All without knowing what Param1 is (generic configuration)
            } else if (param1Type.contains("Integer")) {
                 Integer value = concrete.Param1;
                 // ...
            } // ...
            // Same for Param2 ...
        }
    }

【问题讨论】:

  • 尝试 instanceof,而不是获取类名字符串然后进行比较。 (顺便提一下,使用这个技巧时要注意子类)

标签: java android generics design-patterns data-binding


【解决方案1】:

使用 Java 接口来描述 getter 和 setter。让所有的具体类实现这个接口。将对象转换为接口类型,并根据需要调用 getter 和 setter。

【讨论】:

  • 1) 我不确定我是否理解正确,特别是第一句话 - “描述”是否意味着接口具有布尔 getBoolean()、getInteger() 等?但是鉴于具体类只有 不同 getter 和 setter 的 子集,那么每个具体类都必须包含它实际不使用的过多类型的 null 实现? (如果我理解正确的话)
  • 2) 我意识到我没有提到一个重要的额外要求,即我需要具体的子类在启用此通用配置时承担尽可能少的责任——理想情况下,它们不会真正做更多的事情而不仅仅是指定他们需要的参数。这一点尤其重要,因为我提供了一个库,所以我不会是实现具体类的人。不幸的是,据我所知,您的解决方案在所有具体类中都需要额外的样板代码:(
  • @Cel:首先,您有不同的具体类,都带有“某些字段”。现在,您是说他们没有“某些领域”,而是具有非常不确定的领域。欢迎您尝试应用Property construct from Android 4.0 等技术。就个人而言,我认为这感觉很抽象,并且更好的对象模型将为各方简化事情。
  • 感谢属性突出显示,我发现 a library that makes it available for earlier versions of Android as well..... 我同意这不适合我的情况,因为有足够的结构来使用更严格/更窄的对象模型.我仍然不确定我是否正确理解了您,一些示例代码会使它更清晰,但我也很乐意将它留在这里。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多