Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 基于单个值使用不同的类_Java_Android_Design Patterns - Fatal编程技术网

Java 基于单个值使用不同的类

Java 基于单个值使用不同的类,java,android,design-patterns,Java,Android,Design Patterns,我正在开发一个应用程序,它应该基于单个信息使用不同的类类型。为了更好地说明我的问题,让我举一个例子: 假设INFO是一个布尔值。根据其值,我的代码必须使用某个类A或某个类B的实例。注意,对于每个A,B都是它的子类信息在应用程序启动时设置,并且在整个应用程序生命周期中不会更改 我的问题是:实现这一点的最佳方式是什么 以下是我提出的一些方法,但请随意提出其他建议: 1。带方法的工厂类: public static A getA(final boolean INFO) { return INF

我正在开发一个应用程序,它应该基于单个信息使用不同的类类型。为了更好地说明我的问题,让我举一个例子:

假设
INFO
是一个布尔值。根据其值,我的代码必须使用某个类
A
或某个类
B
的实例。注意,对于每个
A
B
都是它的子类<代码>信息在应用程序启动时设置,并且在整个应用程序生命周期中不会更改

我的问题是:实现这一点的最佳方式是什么

以下是我提出的一些方法,但请随意提出其他建议:

1。带方法的工厂类:

public static A getA(final boolean INFO) {
    return INFO ? new A() : new B();
}
public interface IWrappable<T> {
    T get(final boolean INFO);
}

private static final IWrappable<A> WRAPPER_FOR_A = new IWrappable<A>() {
    public A get(final boolean INFO) {
        return INFO ? new A() : new B();
    }
};

public static A getA(final boolean INFO) {
    return WRAPPER_FOR_A.get(INFO);
}
2。包装类:

class WrapperForSomeClass {

    public final A instance;

    public WrapperForSomeClass(final boolean INFO) {
        instance = INFO ? new A() : new B();
    }

}
3。接口+工厂类:

public static A getA(final boolean INFO) {
    return INFO ? new A() : new B();
}
public interface IWrappable<T> {
    T get(final boolean INFO);
}

private static final IWrappable<A> WRAPPER_FOR_A = new IWrappable<A>() {
    public A get(final boolean INFO) {
        return INFO ? new A() : new B();
    }
};

public static A getA(final boolean INFO) {
    return WRAPPER_FOR_A.get(INFO);
}
公共接口可中断{
T获取(最终布尔信息);
}
私有静态最终iwrapable包装器\u FOR_A=new iwrapable(){
公共获取(最终布尔信息){
退货信息?新A():新B();
}
};
公共静态A getA(最终布尔信息){
返回包装器以获取(信息);
}

如果我必须选择的话,我会选3号。你说什么

我将按如下方式进行:

class A
{
}

class B extends A
{
}

class AFactory
{
    public A getInstance(boolean info) 
    {
        return info ? new A() : new B();
    }
}

class MyMainLauncher
{
    private AFactory aFactory;
    private A instance;

    {
        // has access to the boolean value `info`.
        instance = aFactory.getInstance(info);
    }
}

1是最短最干净的。将此方法放入类中,以避免创建冗余的工厂类


你为什么要选3号?它也有同样的功能,但代码要多得多。

我之所以选择选项3,是因为它给了我(错误?)的灵活性和通用性。至于将工厂方法放在类A中:1-我无法访问源;2-我有大约20个类似的方法要实现,我想我最好使用工厂类,只是为了紧凑性,如果不是为了其他什么的话。我的想法是不是错了?如果没有来源,那么工厂是唯一的选择。然后,由于到1的接口与到3的接口相同,所以可以安全地先实现1,然后在真正需要时重构到3。