Java 重用验证方法。转换对象

Java 重用验证方法。转换对象,java,Java,我有两个相似的类对象。对于第一个类对象,我有几个方法,我也想对第二个类对象重用,但我不确定如何重用,也不想编写重复的方法 我提取并简化了一个例子来展示我的想法 头等舱 public class FirstClass { int number; public int getNumber() { return number; } public void setNumber(int number) { this.number = nu

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

我提取并简化了一个例子来展示我的想法

头等舱

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");
        }
        ...
    }
}
而且no numberIsIFive(firsclass.getNumber())不是一个选项,因为我使用的方法有更多的验证


提前感谢对于这个可能是“过度工程”的案例,但一般来说,您会在这里看到合成,比如:

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

class IntValueHolderImpl implements IntValueHolder { ...
然后,您将“删除”两个类中当前包含的代码,相反,两个类(不知何故)都将有一个IntValueHolder实例

在您的情况下,让您的两个类实现“公共”接口IntValueHolder可能更合适——至少可以避免重复的instanceof调用和向下转换(向下转换到特定的类)


编辑:当然,另一个选择是在这里使用继承-使您的两个类派生自提供此行为的基类。但是,使用继承来避免代码重复在大多数情况下是一个坏主意。类相互继承,因为这在底层模型中是“有意义的”,而不是为了保存一行代码。

对于这种情况,可能是“过度工程化”,但通常您会在这里看到组合,如:

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

class IntValueHolderImpl implements IntValueHolder { ...
然后,您将“删除”两个类中当前包含的代码,相反,两个类(不知何故)都将有一个IntValueHolder实例

在您的情况下,让您的两个类实现“公共”接口IntValueHolder可能更合适——至少可以避免重复的instanceof调用和向下转换(向下转换到特定的类)

编辑:当然,另一个选择是在这里使用继承-使您的两个类派生自提供此行为的基类。但是,使用继承来避免代码重复在大多数情况下是一个坏主意。类相互继承,因为这在底层模型中“有意义”,而不是保存一行代码。

您应该创建一个类,并在两个类中应用它,然后使您的验证方法接收一个接口,而不是一个
对象

例如:

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){
 ...
}
您应该创建一个并在两个类中应用它,然后使您的验证方法接收一个接口,而不是一个
对象

例如:

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){
 ...
}

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

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

public class BaseClass {
    int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}
其中包括您的
第一类
第二类
的所有公共字段和方法。然后从当前的两个类中删除这些方法,只需将它们创建为
public class FirstClass extends BaseClass
,从而为它们提供基类功能

最后,您必须更改您的验证方法,通过如下方式只接受属于基类的对象:
public void numberIsFive(BaseClass myObject)
(一般来说,通过接受方法中的特定类,而不是接受任何旧对象,您会少很多错误)


编辑:其他回答是正确的,继承也是有效的解决方案。使用哪一种取决于在应用程序上下文中什么更有意义。

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

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

public class BaseClass {
    int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}
其中包括您的
第一类
第二类
的所有公共字段和方法。然后从当前的两个类中删除这些方法,只需将它们创建为
public class FirstClass extends BaseClass
,从而为它们提供基类功能

最后,您必须更改您的验证方法,通过如下方式只接受属于基类的对象:
public void numberIsFive(BaseClass myObject)
(一般来说,通过接受方法中的特定类,而不是接受任何旧对象,您会少很多错误)


编辑:其他回答是正确的,继承也是有效的解决方案。您使用哪种方法取决于在应用程序上下文中什么更有意义。

使用继承如何?所有答案都非常好,谢谢。我很难接受这一点,因为这是最接近我最终使用的解决方案。那么使用继承呢?所有答案都很好,谢谢。我很难接受这一点,因为这是最接近我最终使用的解决方案。我猜你想写公共无效数字五(数字myNumber){我猜你想写公共无效数字五(数字myNumber){