我正在尝试Spring Rest服务教程(https://spring.io/guides/gs/rest-service/)并进行自己的修改以反转REST服务调用中给出的给定名称。我正在努力确定哪种方式编写ReverseString方法是更好的OOP设计。以下是我的Name类的两个变体以及里面相应的ReverseString方法。
public class Name {
private String name;
public Name(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
// Is this good OOP design?
public static Name ReverseName(Name myName){
myName.setName(new StringBuilder(myName.getName()).reverse().toString());
return myName;
}
}
-------- ------------- OR
public class Name {
private String name;
public Name(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public void ReverseName(){
this.setName(new StringBuilder(this.getName()).reverse().toString());
}
}
为了更加清晰,这里是我的Spring控制器类:
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value ="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
@RequestMapping("/name")
public Name name(@RequestParam(value="reverse") String name){
Name myName = new Name(name);
myName.ReverseName();
return myName;
}
/**
// Other Option
@RequestMapping("/name")
public Name name(@RequestParam(value="reverse") String name){
return Name.ReverseName(new Name(name));
}
}
/**
}
答案 0 :(得分:2)
它们在功能上有所不同。一个修改对象的内部状态,另一个不修改。
第一个选项不是OOP,而是功能性的。第二个修改了对象的内部状态,并且更多是OOP。
哪一个更好是取决于您的要求。 OOP只是处理一类问题的一种方法,功能可能就好了。