Java:使用本地变量和实例变量?

时间:2016-03-11 00:18:50

标签: java scope instance-variables local-variables

我的申请中有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();

}

3 个答案:

答案 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
  }
}

但是这应该推迟到适当的包装器。