如何在非静态insert方法中调用静态变量maxId实现ID自增
解决方案
要实现新增Movie的ID自增,同时让非静态的insert方法能访问到初始的最大ID,你需要做以下几个关键改动:
1. 将maxId改为类的静态成员变量
原代码里的maxId是静态初始化块的局部变量,外部方法根本访问不到。我们得把它提升为类的静态成员,让整个类的方法都能读写它:
public static List<Movie> movies; // 新增静态成员变量,存储当前最大ID private static int maxId; static { movies = new ArrayList<>(); movies.add(new Movie(1, "Ford vs Ferrari", "Movie on Racing", "abcd", "xyz")); movies.add(new Movie(2, "F2", "Comedy Movie", "Venkatesh", "Tamanna")); movies.add(new Movie(3, "Titanic", "Movie", "Hero", "Heroine")); Movie max = Collections.max(movies, Comparator.comparingInt(Movie::getId)); // 把计算出的初始最大ID赋值给静态变量 maxId = max.getId(); }
2. 在insert方法中实现ID自增
新增Movie时,我们要自动生成自增ID,覆盖JSON传入的ID(如果有的话),同时更新maxId的值:
public Result insert(Http.Request request) { JsonNode jsonNode = request.body().asJson(); if (jsonNode == null) { return badRequest("insufficient movie information"); } Movie movie = Json.fromJson(jsonNode, Movie.class); // 生成自增ID:先将maxId加1,再赋值给新电影 movie.setId(++maxId); movies.add(movie); return ok(Json.toJson(movie)); }
3. 可选:线程安全优化
如果你的应用运行在多线程环境(比如Web服务),直接用int类型的maxId会有线程安全问题(多个线程同时修改可能导致ID重复)。这时候可以用AtomicInteger来保证原子操作:
// 替换静态int为AtomicInteger private static AtomicInteger maxId; static { // ... 原有初始化代码 ... Movie max = Collections.max(movies, Comparator.comparingInt(Movie::getId)); // 初始化AtomicInteger maxId = new AtomicInteger(max.getId()); } // insert方法中修改为: movie.setId(maxId.incrementAndGet());
这样修改后,insert方法就能正确访问并更新最大ID,实现新增Movie的ID自增功能了。
内容的提问来源于stack exchange,提问作者k neha
相关产品推荐
相关产品推荐

