本问题已经有最佳答案,请猛点这里访问。
我已经用Java开发了5年多了。
现在,当我开始编写新的类或代码时,我首先要定义类的属性。因此,每次我的失望时,我都需要点击eclipse生成getter和setter。这是更清晰的代码,最终更容易理解。
但我喜欢抽象和使用OOP和泛型。
因此,人们需要使用Java原语的特定原因或者我们可以在Java中创建这样的类以始终具有getter和setter,并且仍然在Java类成员的正常使用范围内:
public class Property implements Getter,Setter{
protected Type value;
public Property() {
}
@Override
public void set(T value) {
this.value = value;
}
@Override
public Type get() {
return value;
}
public String toString() {
return value.toString();
}
}
您仍然可以使用修饰符来限制对您定义的变量的访问。您仍将使用与以下相同的变量声明:
Class test{
private Property priv_floatProperty = new Property();
protected Property prot_floatProperty = new Property();
public Property publ_floatProperty = new Property();
}
只是想问这个问题,看看其他人对这段代码的看法以及用这种方式编写课程。我真的希望能得到关于这段代码和Java中类设计理论的一些反馈,
不必要的复杂。而你在get方法中的演员阵容并不安全。
请查看Lombok,它部分地解决了getter / setter的样板代码。
如果你想在使用它的类中设置一些属性,你需要编写一个setter来调用该属性的setter ....
那么它的安全性足以在上面的例子中不转换为String。它会在编译"Type missmatch"时给出错误。所以它只会将get方法强制转换回Number的任何子节点。我的意思是不安全吗?又复杂吗?我更喜欢这个设计,然后每次都要在我的代码中编写getter和setter。
@CarlosHeuberger,对不起,你可以使用了。符号是否可访问权限?像anyclass.myproperty.set()
@Pouria Jafari你认为这样做会发生什么:Integer t = priv_floatProperty.get();
@Pouria Jafari。没关系。在任何一种情况下都不安全。任何无法检查客户端预期返回类型的参数化方法都不安全。
我同意它引入了太多的复杂性。如果这是一种常见模式,那么您实际上会在常见的存储库中看到它
@tsolakp我编辑了这门课。它将返回声明的类型,但您可以将其设置为该类型的任何扩展类。还不好吗?让我自我清理一下,如果你不得不写一个超过1000种属性的类。您会选择哪种解决方案?
按照你提出的方式进行,你有一个List字段时你会做什么,并且你想确保getter将始终返回列表的副本,以及一个确保消费者无法访问底层的add()方法清单?
@Pouria Jafari。 get方法看起来不错。
@cleberz您可以在需要时覆盖匿名类函数中的get方法。或者为特定变量创建一个add函数。你可以在访问变量时使用它吗?
这里更大的问题是你不应该为所有对象属性公开访问器,特别是setter。告诉,不要问:如果你只把你的类视为属性包,那么你就是在进行结构化编程,而不是面向对象的编程。
确定你可以使用``anyclass.myproperty.set , but why not use anyclass.myproperty.value = ...` - `myproperty没有添加任何内容,仅使用一个对象来保存另一个对象对我来说有点奇怪,为什么没有另一个对象来持有持有该对象的对象?它确定,IMO,如果它有一些额外的功能(或语义原因),但只是拥有它?
不变性怎么样?你有某种Property类可以防止有人调用set()吗?
@CarlosHeuberger感谢您的意见。它具有的功能之一是setter和getter不再是包含类的一部分。首先访问该属性,然后使用set like anyclass.property.set()。请阅读我对cleberz的下一个答案,了解其优势。
@cleberz实际上我的想法是让getter和setter接口由Property类的子实现。完整的apprauch将有一个例如astract属性类,并有子类如immutuableproperty或NotNullProperty ..我将看看Java中的Optional实现,看看他们是如何做到的。我还试图创建一个例子,例如在类中使用属??性"time"来显示优点。将在今天晚些时候发布示例代码。
我认为你应该只在必要时使用泛型。
首先,为了便于阅读。
其次,您可以快速解决Java类型擦除问题(请参阅参考资料)。 因此,在比较类(以及使用适当的.equals / .hashcode方法)时,您可能会遇到很多问题。 我看到一些困难的案例,唯一的解决方案是使用不可读,复杂和性能成本的反映......
如建议的那样,您可以使用Lombok来绘制getter / setter的抽象。