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