通常的做法是封装经常更改的代码。实际上,它通常采用使用对象来委托变化逻辑的形式。样本如下:
public class SampleClass {
Object obj = new ObjectWithVaryingMethod();
public SampleClass(Object obj){
this.obj=obj;
}
public String getString(){
return obj.toString();
}
public static void main(String args[]){
SampleClass sampleClass=new SampleClass(new ObjectWithVaryingMethod());
System.out.println(sampleClass.getString());
}
}
class ObjectWithVaryingMethod{
@Override
public String toString(){
return "Hi";
}
}
你能否说一下“封装”在不变的情况下可能遇到的问题?当主类本身经常发生变化或改进时,我发现它是一种很好的编码行为。样本如下。在第二种情况下,检索“Hi”,这是不变的部分,被“封装”在另一个类中。
public class SampleVaryingClass {
public static void main(String args[]) {
//here I may opt to print getHi's value on sysout or on a dialog
System.out.println(ObjectWithNonVaryingMethod.getHi());
}
}
在一个完全不同的班级......
public class ObjectWithNonVaryingMethod {
private static final String hi = "Hi";
//"Hi" should always be returned
public static String getHi() {
return hi;
}
}
你可以给一些专业人士和骗子吗?
答案 0 :(得分:1)
两个代码都无法相互比较。一个是静态的,另一个不是。我希望您理解在第一个代码中封装对象的概念。这是第二个的利弊。请记住,静态“通常”不好,默认情况下不支持并发。
的优点:
使用getHi
,您将字符串字段保持为私有,这意味着无法从其他来源设置
假设你需要从其他来源做setHi
,你可以为它添加几个保护条款。这称为defensive programming
。
public static setHi(String input){
if(input == null) { input = ""; } // can throw exception instead
hi = input;
}
缺点: