`
sinokaka
  • 浏览: 326262 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于去掉if判断的一些想法

    博客分类:
  • java
 
阅读更多
一个类中有两个私有变量
如X x1; X x2;

有一个方法 doSomthing(X x) {
    if ( x == x1 ) {
        ......
    } else if (x == x2){
       ........
    }
}

这样写当然可以,可是当X的实例越来越多的时候,if会写得越来越长,怎么才可以去除掉这个if判断呢?

一个想法,就是在X中加一个虚函数如叫doX.
X {
    abstract void doX();
}
那么
doSomething(X x) {
   x.doX(); 
}

这样是简洁了一些,实现方法可以有两个,第一就是用很多子类去实现这个X类,第二个是每个X new的时候都要去实现这个方法,这样写起来比较麻烦。
 
第一种实现方法
public abstract class X {

  abstract void doX();
}

public class X1 extends X {
  void doX(){....};
}

public class X2 extends X {
  void doX(){....};
}

public class Test {
  X x1 = new X1();
  X x2 = new X2();

  public void doSomething(X x) {
      x.doX();
  }
}

第二种实现方法
public abstract X {
  abstract void doX();
}

public class Test {
  X x1 = new X() {
     void doX(){
        ....
     }
  };

  X x2 = new X() {
     void doX(){
        ....
     }
  };

   public void doSomething(X x) {
       x.doX();
   }

}


第一种就是生成的子类会越来越多,感觉很难管理。而且不能读取Test类里面的变量。

第二种,Test类看起来结构有些复杂,但是可以读取Test里面的变量。

有没有更好一点的解决方法:(

 
 
可以用内部类实现
 
内部类实现,既可以访问里面的变量,又可以使整体结构好一点,但是整个类就有些复杂了一些:)
 
public abstract class X {

  abstract void doX();
}



public class Test {
  X x1 = new X1();
  X x2 = new X2();

  public void doSomething(X x) {
      x.doX();
  }
 
  private class X1 extends X {
    void doX(){....};
  }

  private class X2 extends X {
    void doX(){....};
  }
}
 
也可以用反射解决
 
在X里面增加一个属性String methodName,methodName对应的就是在Test类里面写的方法的名称,这样呢,最后靠反射就可以了,先得到方法名,然后呢就去调用方法。
 
public class X {
  private String methodName;
  public String getMethodName(){ return methodName};
  pyblic String setMethodName(String methodName){ this.methodName = methodName;}
 
  public X(){}
  public X(String methodName){this.methodName = methodName;}
}

public class Test {
   X x1 = new X("eat");
   X x2 = new X();
   x2.setMethodName("run");

   public void eat() {
     ..... 
   }

   public void run() {
     ..... 
   } 

   public void doSomething(X x) {
      String methodName = x.getMethodName();
      ...........
   }
}
后面的两种解决办法都可以,其实总体上我觉得还是第2种和第3种的解决办法好一些,当然了,第二种和第三种的取决要看是否去读取Test类中的属性了。
因为这两种解决办法都可以动态的增加X实例,而很少去改动其他无关的代码。
分享到:
评论

相关推荐

    java if判断字符串非空.docx

    `if (c.trim().equals(""))`会去除空格并检查结果是否等于空字符串,因此`if (c.trim().equals(""))`返回`true`,表示`c`在去除空白后为空。 在实际编程中,我们通常会结合使用这些方法来确保准确无误地判断字符串...

    去除Excel公式冗余判断.rar

    "去除Excel公式冗余判断"这个主题主要关注如何优化公式,避免不必要的错误检查,使公式更简洁、高效。 首先,我们需要理解`ISERROR`函数的作用。这是一个内置的错误检查函数,它用于检测一个公式或表达式是否产生了...

    C语言判断一个数是否为素数

    判断一个数是否为素数的思路是:从 2 到该数减 1 之间的所有数去除该数,如果该数不能被任何一个数整除,则该数为素数。 知识点3:直接判断一个数是否为素数 代码如下: ```c #include int main(void){ int val...

    前端vue 判断图片格式

    JS上传文件判断文件格式 GIF JPG PNG

    判断字符串是否回文 程序

    2. 去除空白字符:由于回文通常不考虑空格、标点符号等非字母数字字符,程序可能包含一段代码来去除这些字符,确保只有实际的字母和数字参与判断。 3. 翻转字符串:为了判断字符串是否为回文,一种常见方法是将原...

    判断某字符串是否存在

    给定的代码片段中,首先使用了`Trim`函数来去除字符串两端的空白字符,然后通过`Len`函数检查处理后的字符串长度是否为0,以此来判断字符串是否为空。 ```vb len(trim(text1.text))检查去掉空格后的字符串长度是否...

    java 回文的判断

    在判断回文时,我们通常会去除字符串中的非字母数字字符,然后进行比较。这里的关键在于,我们需要正确处理标点符号和空格。 1. **去除标点符号和空格**:在Java中,我们可以使用`replaceAll()`方法结合正则表达式...

    判断输入数字的正负并给出相应结果

    这里,`open` 函数用于打开文件,`for` 循环遍历每一行,`strip` 方法用于去除行尾的换行符,然后将字符串转换为浮点数并进行判断。 总之,判断数字正负是一项基础的编程任务,它涉及到比较运算符、条件语句和可能...

    使用UNION ALL代替IF语句的合并处理案例

    当需要根据条件选择查询不同表时,通常会使用`IF`语句判断。例如,如果参数`@Flag`为0,查询表A;如果为1,查询表B。 ```sql IF @Flag = 0 SELECT * FROM dbo.A ELSE IF @Flag = 1 SELECT * FROM dbo.B ``` ...

    回文判断_C语言_

    在编程领域,回文判断是一个常见的字符串处理问题。在给定的标题“回文判断_C语言_”中,我们可以理解到这是一个使用C语言编写的程序,它的主要任务是检查一个字符串是否为回文。回文是指一个字符串无论从左向右读...

    判断点是否在多边形内(MFC)

    在计算机图形学中,判断一个点是否位于一个多边形内部是一项基本任务,尤其在MFC(Microsoft Foundation Classes)框架下开发图形用户界面时。本文将详细介绍如何使用射线法(也称为穿越法或Winding Number Test)来...

    利用指针思想判断是否为回文.docx

    ### 利用指针思想判断是否为回文 在计算机科学中,回文是指一个字符串正着读和反着读都一样的特性。本篇文章将基于提供的文件信息来深入探讨如何利用C语言中的指针思想来判断一个字符串是否是回文。 #### 知识点...

    IF浮选机技术特点及其应用实践

    IF浮选机是一种广泛应用于选煤行业中的机械搅拌式浮选设备,它对煤泥的分选有着重要的影响。由于煤炭资源的变化、选煤厂规模的扩大和对煤炭质量要求的提高,对浮选机的要求也不断提高,大型化和高效化成为其主要特征...

    用ASP实现IE地址栏参数的判断

    ### 使用ASP实现IE地址栏参数的判断 在Web开发领域,特别是使用ASP(Active Server Pages)进行开发时,经常会遇到需要处理URL中的查询参数的情况。这些参数通常用于传递额外的信息到服务器端,以便服务器能够根据...

    python如何判断IP地址合法性

    在Python编程中,判断IP地址的合法性是一项常见的任务,特别是在处理网络数据或用户输入时。以下是如何使用Python来实现这个功能的详细说明。 首先,我们要理解IP地址的基本结构。一个标准的IPv4地址由4个0到255...

    易语言文本相似度判断模块

    在"易语言文本相似度判断模块源码"中,开发者可能已经实现了以上提到的一些或全部技术。通过阅读和学习这个模块的源码,我们可以了解到易语言中如何处理文本相似度问题,从而提升自己的编程技能,也可以将其应用到...

    EL表达式做判断 jstl的运用

    ### EL表达式与JSTL在条件判断中的应用 #### 一、EL表达式简介 EL(Expression Language)表达式是JavaServer Pages (JSP) 技术的一部分,用于简化页面上的数据访问过程。它允许开发者在JSP页面中直接访问JavaBean...

    highcharts去掉水印的方法

    对于一些商业应用或是希望提高图表美观度的需求来说,去除这些水印是非常必要的。本文将详细介绍如何在Highcharts中去除水印,并提供具体的代码示例。 #### 一、理解Highcharts水印设置 首先,我们需要了解...

    java判断回文数实例

    // 原始数字去掉个位数 } return true; // 循环结束后,说明是回文数 } public static void main(String[] args) { int num = 12321; System.out.println(isPalindrome(num)); // 输出:true } } ``` 7....

    coif3edge_小波边缘检测_

    1. **图像预处理**:通常包括去除噪声,例如使用高斯滤波器平滑图像,以减少后续边缘检测中的干扰。 2. **小波分解**:对预处理后的图像进行多尺度的小波分解,获取不同尺度下的图像细节信息。对于coif3小波,将...

Global site tag (gtag.js) - Google Analytics