Questions tagged «java»

Java是最初由Sun Microsystems开发的高级,独立于平台的,面向对象的编程语言。Java目前归甲骨文所有,甲骨文于2010年收购了Sun。

3
DAO应该是单身吗?
我正在开发RESTful API,我认为为我的资源使用DAO会很方便,因为尽管我计划仅使用内存来存储它们,但是我不想对使用库的任何人敞开大门,如果他们决定使用DAO的数据库实现。 我的问题是DAO是否应为单例。如果不是,则该服务将具有DAO的实例,并且看起来大致如下: @Path("eventscheduler") public class EventSchedulerService { private IEventSchedulerDao dao = new EventSchedulerDao(); // in case a different implementation is to be used public void setEventSchedulerDao(IEventSchedulerDao dao) { this.dao = dao; } @Path("{uniqueName}") @GET @Produces(MediaType.APPLICATION_JSON) public Tournament getTournament(@PathParam("name") String uniqueName) { return dao.get(uniqueName); } @Path("create") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public …

4
为动词命名布尔字段
在Java中,按照约定,布尔字段的getter和setter将是isField()和setField()。这工作完全正常与是形容词喜欢字段名active,visible,closed,等。 但是,如何命名具有动词含义的字段,例如haveChildren?在动词()上加上“ _ing” ,也许吗?havingChildren 为了澄清,我无法控制方法名称(getter和setter),因为它们是由IDE自动生成的。因此,我需要一个适当的字段名称,以便在IDE为其生成getter时有意义。例如,hasChildren是一个完美的字段名称,但是当IDE为该字段生成getter时,它将为isHasChildren。我该如何解决?
14 java  naming 

4
监视受过测试的班级是不好的做法吗?
我正在一个项目中进行类内部调用,但是结果是简单值的很多倍。示例(不是真实的代码): public boolean findError(Set<Thing1> set1, Set<Thing2> set2) { if (!checkFirstCondition(set1, set2)) { return false; } if (!checkSecondCondition(set1, set2)) { return false; } return true; } 为这种类型的代码编写单元测试真的很困难,因为我只想测试条件系统而不是实际条件的实现。(我在单独的测试中这样做。)实际上,如果我传递实现条件的函数会更好,而在测试中我只提供一些模拟即可。这种方法的问题在于嘈杂:我们大量使用泛型。 一个可行的解决方案;但是,这是使被测对象成为间谍并模拟对内部函数的调用。 systemUnderTest = Mockito.spy(systemUnderTest); doReturn(true).when(systemUnderTest).checkFirstCondition(....); 这里的关注点是有效更改了SUT的实现,并且使测试与实现保持同步可能会出现问题。这是真的?是否有最佳实践来避免这种内部方法调用的麻烦? 请注意,我们正在谈论的是算法的各个部分,因此将其分解为多个类可能不是一个理想的决定。

6
从下面的代码片段中跳过太多if / else-if的更好方法是什么?
我正在尝试编写一个servlet,它根据传递给它的“操作”值执行任务。 这是其中的示例 public class SampleClass extends HttpServlet { public static void action1() throws Exception{ //Do some actions } public static void action2() throws Exception{ //Do some actions } //And goes on till action9 public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException { String action = req.getParameter("action"); /** * I find …

5
可以用全大写字母命名枚举来简化其String表示吗?
几次我见过人们对枚举常量使用标题大小写或什至所有小写字母命名,例如: enum Color { red, yellow, green; } throw new IllegalStateException("Light should not be " + color + ".")例如,如果要这样做,这使得使用它们的字符串形式变得简单容易。 如果枚举是private,这似乎可以接受,但我仍然不喜欢它。我知道我可以使用String字段创建一个枚举构造函数,然后重写toString以返回该名称,如下所示: enum Color { RED("red"), YELLOW("yellow"), GREEN("green"); private final String name; private Color(String name) { this.name = name } @Override public String toString() { return name; } } 但是,看那还要多久。如果您有一堆小的枚举要保持简单,那么继续这样做很烦人。可以在这里只使用非常规大小写格式吗?
14 java  conventions  enum 

1
Java默认方法用法
几十年来,它一直是接口那样的话只 只(只)指定的方法签名。我们被告知这是“正确的做事方式™”。 然后Java 8出来并说: 好吧,嗯,现在您可以定义默认方法了。再见,再见。 我对有经验的Java开发人员和最近(过去几年)开始开发它的人如何消化它感到好奇。我也想知道这如何适合Java正统和实践。 我正在构建一些实验代码,并且在进行一些重构时,最终得到了一个接口,该接口简单地扩展了标准接口(Iterable)并添加了两个默认方法。老实说,我对此感到非常好。 我知道这有点开放,但是现在Java 8已在实际项目中使用了一段时间,围绕默认方法的使用是否存在正统观念?在讨论它们时,我最常看到的是关于如何在不破坏现有使用者的情况下向接口添加新方法。但是像我上面给出的示例一样从一开始就使用它。是否有人在其界面中提供实现时遇到任何问题?

6
将对象映射到演示者的干净的OOP方法
我正在用Java创建一个棋盘游戏(例如国际象棋),其中每个棋子都是自己的类型(例如Pawn,Rook等等)。对于应用程序的GUI部分,我需要为每个这些部分提供一个图像。既然做的像 rook.image(); 违反了UI和业务逻辑的分离,我将为每个作品创建一个不同的演示者,然后将作品类型映射到其相应的演示者,例如 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } 到目前为止,一切都很好。但是,我认为谨慎的OOP专家在调用getClass()方法时会皱眉,并建议像这样使用访客: class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 我喜欢这种解决方案(谢谢您,老师),但是它有一个明显的缺点。每次将新的样片类型添加到应用程序时,都需要使用新的方法来更新PieceVisitor。我想将我的系统用作棋盘游戏框架,可以通过一个简单的过程添加新作品,其中框架的用户只能提供作品及其演示者的实现,并将其插入框架中即可。我的问题:是否有没有等等的干净的OOP解决方案instanceof,getClass()它将允许这种可扩展性?

5
“静态接口”是一种好习惯吗?
我刚刚注意到,在接口中可以选择使用静态方法。与接口的静态字段相同,有一个有趣的行为:这些不是继承的。 我不确定它在要实现的实际接口中是否有用。但是,它使程序员能够创建仅仅是静态内容的信封的接口,例如实用程序类。 一个简单的例子只是全局常量的包络。与班级相比,您可以轻松地注意到public static final那些假定的样板丢失了(使它不太冗长)。 public interface Constants { String LOG_MESSAGE_FAILURE = "I took an arrow to the knee."; int DEFAULT_TIMEOUT_MS = 30; } 您还可以使事情变得更复杂,例如配置键的伪枚举。 public interface ConfigKeys { static createValues(ConfigKey<?>... values) { return Collections.unmodifiableSet(new HashSet(Arrays.asList(values))); } static ConfigKey<T> key(Class<T> clazz) { return new ConfigKey<>(clazz); } class ConfigKey<T> { private …
13 java  java8 

4
如果我的IDE非常聪明,为什么我需要强制转换“ clone()”?
我在输入代码时,我的IDE(NetBeans)类型检查我Collections。但是,为什么我必须转换返回的对象Object.clone()?没关系 无害无犯规。但是我还是不明白。 是否在没有强制转换的情况下进行类型检查,Object.clone()否则无法返回的对象?该仿制药框架让我觉得IDE可以检查类型的“的右侧的对象引用= ”标记而无需进行转换,而我打字?我不明白 附录 我的用例只是我有一个私有Calendar字段pubdate。我打算写: Calendar getPubdate() { return pubdate; } 但是存在调用者可以修改我的pubdate的风险,因此我返回了一个副本: Calendar getPubdate() { return (Calendar) pubdate.clone(); } 然后,我想知道为什么我需要铸造pubdate.clone()。方法签名在那里具有类型。NetBeans应该能够弄清楚这一点。和NetBeans的似乎在做关于类似的东西Collections。

5
破旧/旧版单元测试
我在一家大公司工作,负责一个带有数千个junit测试的大型Java应用程序。自从我担任这个职位以来,已经有200到300个失败的测试(可能是多年失败的测试)。这些测试既旧又脆弱,并且杂乱无章,通常以实时沙盒数据结尾。 我的目标是100%通过测试,这样我们就可以打破单元测试失败的基础,但是直到解决了失败的测试之后我才能做到。我的预算很少,因为维护预算主要用于支持,但是我的团队已经确定并修复了低挂的水果测试(主要是配置/本地资源问题),而我们的测试只有30-40个非常丑陋。 对最佳实践有何看法?我认为测试不是有价值的,但是我也不知道他们正在测试什么,或者为什么他们不钻研就无法工作,这需要我们花费很多时间和金钱。 我想我们应该用我们知道的任何东西记录破损测试的状态,然后完全删除或忽略破损测试,并输入一个较低优先级的错误/工作项来调查和修复它们。然后,我们将达到100%的水平,并开始从其他测试中获得真正的价值,如果我们有维护/重构的意外之财,我们将能够再次进行选择。 最好的方法是什么? 编辑:我认为这是一个不同于该问题的问题,因为我对我们应该编写的测试有明确的方向,但是我继承了遗留失败的测试,以便在当前的大量测试变得有意义之前解决这些问题。

4
是否鼓励使用单字母变量?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 Java是否鼓励使用单字母变量?在代码段或教程中,您经常会看到它们。我无法想象使用它们会受到鼓励,因为它使代码相对难以阅读,而且我从未见过将它们用于其他编程语言!

3
如何使参数保持低计数并仍保持第三方依存关系独立?
我使用第三方图书馆。他们向我传递了一个POJO,出于我们的意图和目的,可能是这样实现的: public class OurData { private String foo; private String bar; private String baz; private String quux; // A lot more than this // IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR OurData(/* I don't know what they do */) { // some stuff } public String getFoo() { …

5
Java堆分配比C ++更快
我已经在SO上发布了这个问题,它的确可以。不幸的是它关闭了(只需要一票就可以重新打开),但是有人建议我将它发布在这里,因为它更合适,因此以下内容实际上是该问题的粘贴内容 我正在阅读对此答案的评论,并且看到了这句话。 对象实例化和面向对象功能使用起来非常快(在许多情况下,它们比C ++更快),因为它们是从一开始就设计的。且收集速度很快。即使在大多数优化的C代码方面,标准Java在这一领域也优于标准C / C ++。 一位用户(我可能会添加非常高的代表)大胆地捍卫了这一主张,并指出 Java中的堆分配比C ++更好 并添加了该语句来捍卫Java中的集合 与Java集合相比,Java集合与C ++集合相比速度更快,这在很大程度上归因于内存子系统的不同。 所以我的问题是,这是否真的是真的,如果是的话,为什么Java的堆分配这么快?


2
我的小型软件库应该避免使用其他库吗?
我刚刚发布了一个小的Java库,其中仅提供了几个类和方法。自从我使用Maven构建项目以来,我立即使用了几个第三方库来实现我的目标,特别是: commons-lang3(用于一些通用的Java东西) slf4j-api(用于记录) commons-io(用于一小部分文件,我认为一次读取一个文件) 我不希望我的图书馆在别人眼中显得appear肿。我是否应该尝试摆脱对这些库的依赖以最大程度地减少占用空间?在将来考虑使用更多类型的库时,最好避免使用哪种类型的库?
13 java  libraries  maven 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.