2011-06-21 80 views
0

所以我知道参考变量不能更改。Java - 更改参考变量

我处于有两个不同职业的职位。我们称它们为A和B.它们具有相同的方法(方法称为相同),它们只是为类指定的。

我需要一个聪明的方式来改变实例化的类。

一种方法可能是用一些布尔测试来检查选择了哪个选项,然后实例化相应的类。虽然我担心这可能变得笨重和丑陋,所以我试图避免这种方式。一定有更聪明的东西。

目前我正在考虑做一个新的类(如C)的扩展同一类A和B.

然后我会重写方法(A类和B还做BTW),然后根据设置执行方法(即选择哪个A或B类)。该方法将返回相同的类在A或B类。

希望我不是说完整的胡言乱语。

回答

6

一种方法是使用Factory Pattern。维基百科

部分报价:

像其他创建型模式,它 涉及不指定 确切的类的对象,这将是 创建的创建 对象(产品)的问题。

例如,

public abstract class Base { 

    public abstract void doSomething(); 
} 

public class A extends Base { 

    public void doSomething() { 
     System.out.println("A"); 
    } 
} 

public class B extends Base { 

    public void doSomething() { 
     System.out.println("B"); 
    } 
} 

public class C extends Base { 

    public void doSomething() { 
     System.out.println("C"); 
    } 
} 

public interface BaseFactory { 

    public Base createBase(int condition); 

} 

public class DefaultBaseFactory implements BaseFactory { 

    public Base createBase(int condition) { 

     switch (condition) { 
      case 0 : return new A(); 
       break; 

      case 1: return new B(); 
       break; 

      case 3: return new C(); 
       break; 

      default: return null; 
       break; 
     } 
    } 
} 
+0

我会用一个枚举作为'createBase()'的参数为了减少选项的数量。 – Thomas

+0

@Thomas,枚举很好,我简单地说明了这个例子。 –

+0

我会尽力读到这一点。似乎这是我正在处理的问题。谢谢。 –

1

你的解释很混乱。但是,这听起来像你应该从一个共同的基类(或接口)扩展AB

abstract class Base { 
    public abstract void someMethod(); 
} 

class A extends Base { 
    public void someMethod() { System.out.println("A"); } 
} 

class B extends Base { 
    public void someMethod() { System.out.println("B"); } 
} 

这意味着你可以做这样的事情:

Base base; 
if (someCondition) { 
    base = new A(); 
} 
else { 
    base = new B(); 
} 

base.someMethod();