重用验证方法。转换对象

时间:2016-10-17 14:44:50

标签: java

我有两个相似的类对象。我有一些第一类对象的方法,我也想重用于我的第二类对象,但我不确定如何以及我不想编写重复的方法。

我提取并简化了一个例子来说明我的想法。

头等舱

public class FirstClass {
    int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
    ...
}

第二课

 public class SecondClass {
        int number;

        public int getNumber() {
            return number;
        }

        public void setNumber(int number) {
            this.number = number;
        }
        ...
    }

第三课

public class Main {
    public static void main(String[] args) {
        FirstClass firstClass = new FirstClass();
        firstClass.setNumber(5);
        SecondClass secondClass = new SecondClass();
        secondClass.setNumber(5);

        numberIsFive(firstClass);
        numberIsFive(secondClass);
    }

    public void numberIsFive(Object myObject){
        if(myObject instanceof FirstClass){
            myObject = (FirstClass)myObject;
        }else if(myObject instanceof SecondClass){
            myObject = (SecondClass)myObject;
        }

        if(myObject.getNumber() == 5){
            System.out.println("is five");
        }else{
            System.out.println("is not five");
        }
        ...
    }
}

并且没有numberIsIFive(firsclass.getNumber())不是一个选项,因为我使用的方法有更多的验证。

提前致谢

3 个答案:

答案 0 :(得分:4)

对于这种可能过度工程"的情况,但总的来说,你会在这里看到组合,例如:

interface IntValueHolder {
  int getNumber();
  void setNumber(int value);
}

class IntValueHolderImpl implements IntValueHolder { ...

然后你会"掉落"您目前在两个类中都有的代码,相反,这两个类(以某种方式)都有一个IntValueHolder实例。

在你的情况下,简单地让你的两个类实现那个" common" interface IntValueHolder - 至少避免重复的instanceof调用和downcast(直到特定的类)。

编辑:当然,另一种选择是在这里使用继承 - 让你的两个类派生自一些提供这种行为的基类。但是使用继承只是为了避免代码重复大多数时候都是一个坏主意。类继承彼此,因为这使得" sense"在底层模型中,不要保存一行代码。

答案 1 :(得分:2)

在继续之前,我建议您自己阅读它和其他面向对象的编程概念。

关注这种特殊情况,您应该创建一个基类,例如

public class BaseClass {
    int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

其中包括FirstClassSecondClass的所有常用字段和方法。然后从当前的两个类中删除这些方法,并将它们创建为public class FirstClass extends BaseClass,以便为它们提供BaseClass功能。

最后,您必须更改验证方法,只接受属于您的基类的对象,方法如下public void numberIsFive(BaseClass myObject)(作为一般规则,您通过接受一个更少的错误方法中的特定类,而不是接受任何旧对象。)

编辑:其他回答者是正确的,继承也是一种有效的解决方案。您使用哪一个取决于您在申请环境中更有意义的内容。

答案 2 :(得分:1)

您应该创建一个interface并在两个类中应用它,然后让您的验证方法接收一个界面,而不是Object

示例:

public interface Number {

    int get();

    void set(int n);
}

然后你的课程将如下所示:

public class FirstClass implements Number {

    int number;

    @Override
    public int get() {
        return number;
    }

    @Override
    public void set(int n) {
        this.number = n;
    }
}

您的验证方法会收到一个数字:

public void numberIsFive(Number myNumber){
 ...
}