如何在Java中删除属性及其值?
我对Java世界是如此陌生,所以请善待我 我有一个类具有以下属性:如何在Java中删除属性及其值?,java,Java,我对Java世界是如此陌生,所以请善待我 我有一个类具有以下属性: public class Test{ private long prop1; private long prop2; public long getProp1() { return prop1; } public void setProp1(long prop1) { this.prop
public class Test{
private long prop1;
private long prop2;
public long getProp1() {
return prop1;
}
public void setProp1(long prop1) {
this.prop1= prop1;
}
public long getProp2() {
return prop2;
}
public void setProp2(long prop2) {
this.prop2 = prop2;
}
}
现在,我在完成一些操作后,填充了类Test的对象,该对象将被发送到oData以进行保存。不知何故,我不想将prop2插入到将进入oData调用的字符串中,那么我如何才能删除prop2及其值呢
[prop1=1,prop2=2]您需要一种为您详细说明的方法 一个选项是定义方法并根据需要打印属性 作为方向,您可以查看这个自动生成的toString方法
@Override
public String toString() {
return "_Foo [prop1=" + prop1 + ", prop2=" + prop2 + "]";
}
移除(u Foo)部分就可以了
问题是我需要prop2直到一个级别才能执行某些操作,但我需要在oData调用之前移除它,这可能吗
我不知道。另外,我不知道oData,你的问题有点难以回答,因为你提供的信息很少。然而,基于上述评论,我将建议两件事:
方法#1:降低等级
换句话说,创建一个类似于Test
的类,除去不需要的成员。在其构造函数中,复制提交的Test
对象的每个其他成员,有效地创建一个可用于oData的副本:
Test test1 = new Test();
test1.setProp1(1337L);
test1.setProp2(1007L);
/* Do something with test1, including prop2 */
TestReduced test2 = new TestReduced(test1);
/* Do oData stuff with test2, no prop2 anymore */
这是一个非常复杂的解决方案,它要求您在TestReduced
中镜像对Test
的所有更改。一个通用的接口或一个抽象基类可以很好地保护这个过程,因此如果您这样做的话,我肯定会建议您安装一个。还应该考虑添加<强>私有构造函数< /强>,而不是用于<代码> TESTREST 的参数,以确保只能从<代码>测试< /代码>对象创建。或者,让Test
类使用类似getReducedInstance()
的方法创建TestReduced
的实例,这将使Test
方法2:成员地图
与其有两个成员,prop1
和prop2
,不如使用地图
public class Test {
private HashMap<String, Long> props = new HashMap<>();
public Test() {
props.put("prop1", 0L);
props.put("prop2", 0L);
}
public void setProp1(long prop1) {
props.put("prop1", p);
}
public void setProp2(long prop2) {
props.put("prop2", p);
}
public long getProp1() {
props.get("prop1");
}
public long getProp2() {
props.get("prop2");
}
public void prepareForSerialization() {
props.remove("prop2");
}
}
公共类测试{
私有HashMap props=newhashmap();
公开考试(){
道具放置(“道具1”,0升);
放置道具(“道具2”,0升);
}
公共无效集合prop1(长prop1){
道具。推杆(“道具1”,p);
}
公共空间集合prop2(长prop2){
道具。推杆(“道具2”,p);
}
公共长getProp1(){
道具。获取(“道具1”);
}
公共长getProp2(){
道具。获取(“道具2”);
}
公开无效制备工业化(){
移除道具(“道具2”);
}
}
我不知道这对oData是否有效。但对于处理任意数量的属性来说,这无疑是一种非常灵活的方法。使用getter和setter,可以隐藏实现(HashMap
vs.primitive-type memebers)。或者,如果愿意,可以通过提供诸如getProp(字符串名称)
和setProp(字符串名称,长值)
之类的方法向用户公开它。所有这些都是假设你所有的道具都是long
类型
显然,如果您有两个用于序列化(?)的方法会更好,一个包含
prop1
,另一个不包含。但由于您明确表示需要删除一个成员,因此我想到了这一点。我想您可能会有某种序列化程序(将数据更改为JSON、XML等)。通常,您可以指定哪些字段可用于序列化结果,哪些字段不可用于序列化结果。您需要包括如何序列化您的类,以便我们能够更好地提供帮助。如果这就是您发送数据的方式,那么在发送之前使用单独的方法并调用该方法可能会很有用。最坏的情况是,您可以使用类似的类而不使用prop2(TestReduced
)它有一个构造函数,它接受一个Test
对象,基本上复制除了prop2之外的所有内容。然后,只要需要prop2,您就可以使用Test
对象,并在需要完成不应该接触到prop2
的工作时,从中创建一个TestReduced
。有点复杂,但它会完成工作。我们仍然需要知道序列化(?)是如何实际发生的。无论如何,我在上面的评论中做了一个回答,希望它适合你的情况。但事实上,更多的信息会很有帮助。你的第一个评论解决了我的问题,我创建了另一个类,它没有我不需要的属性。我已经在类本身中有了这个部分,问题是我需要prop2直到一个级别才能执行某些操作,但我需要在oData调用之前删除它,有可能吗?您可以在类中添加一个布尔值,serializeProp2
,您可以通过某种方法enableProp2(boolean enable){serializeProp2=enable;}
,然后在toString()
中考虑该标志。谢谢您的帮助。
public class Test {
private HashMap<String, Long> props = new HashMap<>();
public Test() {
props.put("prop1", 0L);
props.put("prop2", 0L);
}
public void setProp1(long prop1) {
props.put("prop1", p);
}
public void setProp2(long prop2) {
props.put("prop2", p);
}
public long getProp1() {
props.get("prop1");
}
public long getProp2() {
props.get("prop2");
}
public void prepareForSerialization() {
props.remove("prop2");
}
}