封装经常变化的代码是一种常见的做法。事实上,它通常采用使用对象来委托(delegate)不同逻辑的形式。示例如下:
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());
}
}
在一个完全不同的类(class)......
public class ObjectWithNonVaryingMethod {
private static final String hi = "Hi";
//"Hi" should always be returned
public static String getHi() {
return hi;
}
}
你能给出一些这样做的优点和缺点吗?
最佳答案
两个代码无法相互比较。一种是静态的,另一种则不是。我希望您理解第一个代码中封装对象的概念。这是第二个的优点和缺点。请记住,静态“通常”是不好的,并且默认情况下不支持并发。
优点:
使用
getHi
,您可以将字符串字段保持为私有(private),这意味着它无法从其他源设置假设您需要从其他来源执行
setHi
,您可以为其添加几个保护子句。这称为防御性编程
。public static setHi(String input){ if(input == null) { input = ""; } // can throw exception instead hi = input; }
缺点:
- 不用说,它是静态的
- 除了保护条款之外,您不会获得任何优势。如果您的类不是静态的,您可以将其与实现相同接口(interface)的其他类或从该类继承的其他类交换。
关于java - 封装什么不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19152422/