如何在Java中修剪其某些字段的对象?
假设我们有一个Object
类型的对象obj
,使System.out.println(obj)
生成{a=Some text, b=Some more text, c=Even more text}
。
现在我们想要创建一个新对象obj2
,它只是{a=Some text}
(即,字段b
和c
是从obj
中删除的)。 所以我们定义一个类A
如下:
class A { String a; }
然后我们按如下方式初始化obj2
:
A obj2 = (A) obj
。
不幸的是,这样做时出现运行时错误。
问题:我们如何定义上面概述的obj2
?
假设您在class A
有三个字段f1,f2,f3
使用字段f1
创建新的class B
像这样在class A
类中声明一个方法
public B getTrimmedObject()
从A设置B的必填字段。
例如, 设置f1并返回B对象
Other way : use composition over inheritance
.B将成为A的成员,你可以简单地从A获得B. In this case split fields between A and B and avoid duplication
。
f1将是B和B的一部分,f2,f3将成为A的一部分。构造函数将通过B和f2设置f1值,f3通过正常初始化设置
编辑:示例代码:
public class A{ private B b; private String f2; private String f3; public A(String f1,String f2,String f3){ b = new B(f1); this.f2 = f2; this.f3 = f3; System.out.println("In A->B:"+getB().getF1()+":A:f2:"+f2+":A:f3:"+f3); } public B getB(){ return this.b; } public static void main(String args[]){ if (args.length < 3) { System.out.println("Usage: java A str1 str2 str3"); return; } A a = new A(args[0],args[1],args[2]); } } class B{ private String f1; public B(String f1){ this.f1 = f1; } public String getF1(){ return this.f1; } } java A apple banana camel In A->B:apple:A:f2:banana:A:f3:camel
您获得exception的原因是因为obj
只是Object
类型; 你不能“神奇地”把它变成A
所以它适合obj2
。 在Java中,您只能将Object转换为它已经存在的类型; 你不能做一些不是A
和A
。 相反,您必须手动复制属性, obj2.a
obj.a
设置为obj.a
分配obj2.a = obj.a
一种替代方法是使obj
和obj2
为A
,其中obj也是更具体的类型B
例如,假设您要按如下方式定义A
类:
public class A { public String a = "Some text"; }
然后,您可以将B
定义为:
public class B extends A { public String b = "Some more text"; public String c = "Even more text"; }
最后,您可以这样创建对象:
B obj = new B(); A obj2 = obj; System.out.println(obj2.a); // Prints "Some text" System.out.println(obj2.b); // Throws an error
请注意,在第二种方法中,obj2 仍然具有属性b
和c
; 他们只是无法访问。
在java中,每个对象都是一个Object
。 因此obj
必须是一个Object
。 但这并不意味着obj
只是一个Object
。 当然,如果你得到System.out.println(obj)
一些可读结果,那么obj
从另一个类扩展。
它不是类型A
因为A a = (A)obj
给出错误。 您可以使用以下命令查看obj
的类名:
System.out.println(obj.getClass().getName());
我们假设obj
来自B
类。 有一些事情要做你想做的事情。
如果您可以更改B
的定义,那么您可以从A
类extend
B
类。 然后A a = (A)obj;
将工作。
class B extends A{ ... }
但是,如果你打印a
你将无法获得所需的输出。
您可以更改A
类。
class A{ private B b; public A(B b){ this.b = b; } @Override public String toString() { return "{a=" + ba + "}"; } }
然后你必须创建A a = new A(obj);
。 你不能投这个。 但是如果你打印a
你将得到你想要的输出。
希望这可能会有所帮助!!