我的申请中有3 classes
:
1。 Runner / Main (调用服务类)
2。服务类(执行商务逻辑)
第3。存储库类(由服务调用以进行数据库查询)
我不确定在服务类中实现变量的最佳方法。哪个是下面2的最佳方式,为什么?
E.g。我应该有实例变量:
public class DogService{
List<Dogs> dogList= new ArrayList<Dog>(); //instance var
public DogService(){}
public List<dogs> getAllDogs(){
dogList=dogRepository.getAll();
return dogList;
}
}
方法中的或局部变量:
public class DogService{
public DogService(){}
public List<dogs> getAllDogs(){
List<Dogs> dogList= new ArrayList<Dog>(); //local var to method
dogList=dogRepository.getAll();
return dogList;
}
}
使用服务类的示例:
public class Runner {
List<Dogs> listOfAllDogs = new ArrayList<Dog>();
DogService dogService = new DogService();
public static void main(String[] args) {
listOfAllDogs = dogService.getAllDogs();
}
答案 0 :(得分:1)
如果dogList
不会更改,那么将其作为字段将允许您可能缓存它。对于可能有小狗或死亡的dogs
可能不是一个好主意,但如果它是一个静态列表或东西,它会有一些用途。
e.g。
if (dogList == null) {
dogList= new ArrayList<Dog>();
dogList=dogRepository.getAll();
}
return dogList;
答案 1 :(得分:1)
在第一种情况下,您使用实例创建一个新的ArrayList,并在离开方法后保留对狗列表的引用。你在浪费记忆力。
此外,它是您所使用的类中的一个字段,因此它会使您无法使用的行删除代码。
它也可能是错误的来源。声明了此变量,并且其名称表明了其用途。稍后,另一个开发人员可能会尝试将其用于其他内容,并且,根据该方法是否先调用,它会工作或崩溃。
在第二种情况下,变量没用,因为您可以立即返回getter的结果。但编译器会为您处理,所以您不必担心它。
答案 2 :(得分:1)
这完全是意见,但你误解了服务层的典型含义,即:
public class DogService{
Repository repository;
public DogService(Repository repo){
this.repository = repo;
}
public List<dogs> getAllDogs(){
return this.repository.getAll();
}
}
service
有责任知道在哪里寻找狗。它没有参与尝试记住特定的狗或查找它们:它delegates
对底层存储库负责。
回答你的问题,意味着既不方法,也不应该记住狗的名单。如果另一种方法(例如getAllDogNames
)需要做一些时髦的事情,则可能需要一个实例变量:
public List<String> getAllDogNames(String prefix){
List<Dog> dogs = this.getAllDogs();
List<String> names = new ArrayList<String>();
for (dog : dogs) {
names.add(prefix + dog.getName()); //Or whatever
}
}
但是这应该推迟到适当的包装器。