有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为具有类似方法的对象设计Java模式和避免if语句

我有两门课,例如A和B。
这些类有两个同名的getter/setter方法

现在,在代码中,我执行以下操作:

if(obj.getClassName().equals(A.class.getName())){
   A a = (A) obj;
   String result = a.getInfo();
}
else if(obj.getClassName().equals(B.class.getName())){
   B a = (B) obj;
   String result = a.getInfo();
}

我想知道是否有一种方法可以调用getInfo来避免if语句
注意:我不能重构类来使用继承或其他方法
我只是想知道java中是否有避免if语句的技巧


共 (4) 个答案

  1. # 1 楼答案

    如果这是你想要达到的目标,请参考:this tutorial

  2. # 2 楼答案

    除非您想使用反射,否则不会。Java会将两种类型的方法(getInfo())声明为完全独立的,使用完全独立的方法

    如果你有共同点,你应该使用一个共同的超类或共同的接口,它们都继承。您已经将问题标记为“设计模式”——该模式是使用该语言提供的工具来显示通用性

    正如Eng.Fouad所显示的,使用instanceof无论如何都更简单,而且更好,因为这意味着您的代码仍然可以使用AB的子类

    当然,你可以通过把它放在一个地方,或者用一个可以由AB构造的facade类,或者用一个方法执行这个检查,然后从多个地方调用它,来隔离这个丑陋

  3. # 3 楼答案

    如果obj被声明为A或B,则可以使用重载方法。(对于类型安全性来说,这是一个很好的论据。)这里有一个测试可以说明这一点:

    import static org.junit.Assert.*;
    
    import org.junit.Test;
    
    public class FooTest {
    
        class A {
            public String getInfo() {
                return "A";
            }
        }
    
        class B {
            public String getInfo() {
                return "B";
            }
        }
    
        public String doBarFor(A a) {
            return a.getInfo();
        }
    
        public String doBarFor(B b) {
            return b.getInfo();
        }
    
        public String doBarFor(Object obj) {
            throw new UnsupportedOperationException();
        }
    
        @Test
        public void shouldDoBarForA() {
            A a = new A();
            assertEquals("A", doBarFor(a));
        }
    
        @Test
        public void shouldDoBarForB() {
            B b = new B();
            assertEquals("B", doBarFor(b));
        }
    
        @Test(expected = UnsupportedOperationException.class)
        public void shouldFailIfDeclaredAsObject() {
            Object a = new A();
            assertEquals("A", doBarFor(a)); // exception thrown
        }
    }
    
  4. # 4 楼答案

    如果您不能使用继承,并且希望避免if语句(即使使用instanceof)。。。好最好的办法是将检查、强制转换和调用封装在一个函数中,以避免代码重复。。。否则就没办法了