如何修剪 Java 中某些字段的对象?
How to prune an object of some of its fields in Java?
假设我们有一个类型为 Object
的对象 obj
,使得 System.out.println(obj)
产生 {a=Some text, b=Some more text, c=Even more text}
.
现在我们要创建一个新对象 obj2
,它只是 {a=Some text}
(即字段 b
和 c
被 p运行ed来自 obj
)。所以我们定义一个classA
如下:
class A {
String a;
}
然后我们初始化obj2
如下:
A obj2 = (A) obj
.
不幸的是,我在执行此操作时遇到 运行 时间错误。
问题:我们如何定义 obj2
如上所述?
你得到异常的原因是因为 obj
只是类型 Object
;你不能 "magically" 把它变成一个 A
所以它适合 obj2
。在 Java 中,您只能将对象转换为它 已经 的类型;你不能制作不是 A
和 A
的东西。相反,您必须手动复制属性,即将 obj2.a
设置为 obj.a
。
分配 obj2.a = obj.a
的一种替代方法是使 obj
和 obj2
都成为 A
类型,其中 obj 也是更具体的类型 B
.例如,假设您要定义 A
class 如下:
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
是从另一个 class.
扩展而来的
它不是 A
类型,因为 A a = (A)obj
给出了错误。您可以使用以下命令查看 obj
的 class 名称:
System.out.println(obj.getClass().getName());
我们假设 obj
来自 class B
。有一些事情可以做你想做的事。
如果您可以更改 B
的定义,那么您可以从 class A
extend
class B
。那么 A a = (A)obj;
就可以了。
class B extends A{
...
}
但是如果你打印 a
你将得不到你想要的输出。
您可以更改 class A
。
class A{
private B b;
public A(B b){
this.b = b;
}
@Override
public String toString() {
return "{a=" + b.a + "}";
}
}
然后你必须创建A a = new A(obj);
。你不能投这个。但是如果你打印 a
你会得到你想要的输出。
希望这对您有所帮助!!
假设您在 class A
中有三个字段 f1,f2,f3
使用字段 f1
创建一个新的 class B
像这样在 class A
中声明一个方法
public B getTrimmedObject()
根据 A 设置 B 的必填字段。
例如设置 f1 和 return 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 设置 f1 值,而 f2、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
假设我们有一个类型为 Object
的对象 obj
,使得 System.out.println(obj)
产生 {a=Some text, b=Some more text, c=Even more text}
.
现在我们要创建一个新对象 obj2
,它只是 {a=Some text}
(即字段 b
和 c
被 p运行ed来自 obj
)。所以我们定义一个classA
如下:
class A {
String a;
}
然后我们初始化obj2
如下:
A obj2 = (A) obj
.
不幸的是,我在执行此操作时遇到 运行 时间错误。
问题:我们如何定义 obj2
如上所述?
你得到异常的原因是因为 obj
只是类型 Object
;你不能 "magically" 把它变成一个 A
所以它适合 obj2
。在 Java 中,您只能将对象转换为它 已经 的类型;你不能制作不是 A
和 A
的东西。相反,您必须手动复制属性,即将 obj2.a
设置为 obj.a
。
分配 obj2.a = obj.a
的一种替代方法是使 obj
和 obj2
都成为 A
类型,其中 obj 也是更具体的类型 B
.例如,假设您要定义 A
class 如下:
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
是从另一个 class.
它不是 A
类型,因为 A a = (A)obj
给出了错误。您可以使用以下命令查看 obj
的 class 名称:
System.out.println(obj.getClass().getName());
我们假设 obj
来自 class B
。有一些事情可以做你想做的事。
如果您可以更改 B
的定义,那么您可以从 class A
extend
class B
。那么 A a = (A)obj;
就可以了。
class B extends A{
...
}
但是如果你打印 a
你将得不到你想要的输出。
您可以更改 class A
。
class A{
private B b;
public A(B b){
this.b = b;
}
@Override
public String toString() {
return "{a=" + b.a + "}";
}
}
然后你必须创建A a = new A(obj);
。你不能投这个。但是如果你打印 a
你会得到你想要的输出。
希望这对您有所帮助!!
假设您在 class A
f1,f2,f3
使用字段 f1
class B
像这样在 class A
中声明一个方法
public B getTrimmedObject()
根据 A 设置 B 的必填字段。
例如设置 f1 和 return 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 设置 f1 值,而 f2、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