Questions tagged «java»

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

30
为什么Java不用于现代Web应用程序开发?[关闭]
作为专业的Java程序员,我一直在试图理解-为什么现代Web应用程序讨厌Java? 我注意到一种趋势,在当今的网络初创企业中,相对较小的比例似乎正在使用Java(与Java的整体普及率相比)。当我问了一些有关此问题的信息时,通常会收到诸如“我满怀热情地讨厌Java”之类的回复。但是似乎没有人真的能够给出明确的答案。 我也听说过,同一网络启动社区对Java开发人员的评价是负面的-或多或少地暗示他们很慢,没有创造力。 结果,我花了一些时间来学习Ruby / Rails,基本上是要找出我所缺少的东西。但是我忍不住想自己:“如果使用Java,我可以更快地完成此工作”,这主要是由于我的相对经验水平。 但这也是因为我没有看到Java遇到任何严重的“遗漏”,因此无法构建相同的应用程序。 这使我想到了一个问题: 为什么在现代Web应用程序中不使用Java? 这是语言的弱点吗? 这是Java的一种不公正的刻板印象吗,因为它已经存在了很长时间(它与较早的技术存在不公平的联系,并且没有因为其“现代”功能而获得认可)? Java开发人员的负面刻板印象是否太强了?(Java不再是“酷”了) 用其他语言编写的应用程序真的可以更快地构建,更容易维护并且性能更好吗? Java是否仅由太慢而无法适应新语言的大公司使用?

16
杂乱无章的Java文化-为什么事情如此繁重?它优化了什么?[关闭]
我以前经常用Python编写代码。现在,出于工作原因,我使用Java编写代码。我从事的项目相当小,也许Python会更好地工作,但是有使用Java的非工程性正当理由(我无法详述)。 Java语法没问题;这只是另一种语言。但是,除了语法外,Java还具有被视为“正确”的文化,一套开发方法和实践。现在,我完全无法“培养”这种文化。因此,我将不胜感激正确方向的解释或指点。 我开始的堆栈溢出问题中提供了一个最小的完整示例:https://stackoverflow.com/questions/43619566/returning-a-result-with-several-values-the-java-way/43620339 我有一个任务-解析(从单个字符串)并处理一组三个值。在Python中,它是一个单行(元组),在Pascal或C中,它是一个五行记录/结构。 根据答案,可以在Java语法中使用struct的等效项,在广泛使用的Apache库中使用struct的等效项-但是“正确”的实现方法实际上是通过为值创建一个单独的类,并完成吸气剂和二传手。有人很乐意提供一个完整的例子。它是47行代码(嗯,其中一些行是空白)。 我知道,庞大的开发社区可能并非“错误”。因此,根据我的理解,这是一个问题。 Python实践优化了可读性(按照这种哲学,导致了可维护性),然后提高了开发速度。C惯例针对资源使用进行了优化。Java实践针对什么进行了优化?我最好的猜测是可伸缩性(一切都应准备好以百万计的LOC项目的状态),但这是一个非常微不足道的猜测。


7
Spring框架做什么?我应该使用它吗?为什么或者为什么不?
因此,我正在用Java启动一个全新的项目,并正在考虑使用Spring。我为什么要考虑春季?因为很多人告诉我我应该使用Spring!认真地说,每当我试图让人们解释Spring到底是什么或做什么时,他们永远无法给我一个直接的答案。我已经在SpringSource网站上查看了这些介绍,它们要么真的很复杂,要么真的是针对教程的,它们都没有给我一个很好的主意,为什么我应该使用它,或者它如何使我的生活更轻松。有时人们会抛出“依赖注入”这个术语,这使我更加困惑,因为我认为我对该术语的含义有不同的理解。 无论如何,这里有一些关于我的背景和我的应用程序的信息: 在Java中开发了一段时间,从事后端Web开发。是的,我进行了大量的单元测试。为了实现这一点,我通常制作(至少)一种方法的两个版本:一个使用实例变量,一个仅使用传递给该方法的变量。使用实例变量的一个调用另一个,提供实例变量。当进行单元测试时,我使用Mockito模拟对象,然后调用不使用实例变量的方法。这就是我一直以来所理解的“依赖注入”。 从CS的角度来看,我的应用程序非常简单。小型项目,需要1-2个开发人员。通常是CRUD类型的操作,并附带大量搜索。基本上是一堆RESTful Web服务,再加上Web前端,最后是一些移动客户端。我正在考虑使用直接的HTML / CSS / JS / JQuery进行前端,因此没有真正的计划使用JSP。使用Hibernate作为ORM,并使用Jersey来实现Web服务。 我已经开始编码,非常渴望在那里获得一个演示,我可以四处逛逛,看看是否有人想投资。因此,显然时间至关重要。我了解到Spring具有相当的学习曲线,而且看起来它需要一堆XML配置,而我通常会尽量避免这种麻烦。但是,如果这可以使我的生活更轻松,并且(尤其是)可以使我的生活和开发速度更快,那么我愿意痛不欲生,学习Spring。 所以,请。教我 我应该使用Spring吗?为什么或者为什么不?

6
在git存储库中的单个或多个项目之间进行选择?
在git我们已将大多数项目模块化的环境中,我们面临着每个存储库一个项目或每个存储库设计问题多个项目的问题。让我们考虑一个模块化项目: myProject/ +-- gui +-- core +-- api +-- implA +-- implB 今天,每个存储库有一个项目。它给了自由 release 个别组件 tag 个别组件 但这对于branch组件也很麻烦,因为分支通常api需要和中的等效分支core,并且可能还有其他组件。 鉴于我们希望使用release单个组件,我们仍然可以通过每个存储库设计利用多个项目来获得类似的灵活性。 有哪些经验?您如何/为什么解决这些问题?

6
是什么使Haskell类型系统如此受人尊敬(相对于Java)?
我开始学习Haskell。我对此很陌生,我只是在阅读一些在线书籍,以了解其基本结构。 熟悉它的人经常谈论的“模因”之一就是整个“如果它可以编译,它将可以工作*”的东西-我认为这与类型系统的强度有关。 我试图理解为什么Haskell在这方面到底比其他静态类型的语言要好。 换句话说,我假设在Java中,您可以做一些令人讨厌的ArrayList<String>()事情,例如埋葬, 以包含确实应该包含的内容ArrayList<Animal>()。这里令人讨厌的事情是您的stringcontains elephant, giraffe等,如果有人放进去,Mercedes您的编译器将无法为您提供帮助。 如果这样做了,ArrayList<Animal>()那么在以后的某个时间点,如果我确定我的程序不是真正的关于动物的,而是关于车辆的,那么我可以更改,例如产生ArrayList<Animal>生产的功能,ArrayList<Vehicle>而我的IDE应该告诉我那里的所有地方是一个编译中断。 我的假设是,这就是人们所说的强类型系统的含义,但是对我而言,为什么Haskell的更好才是显而易见的。换句话说,您可以编写好的Java或坏的Java,我假设您可以在Haskell中执行相同的操作(即,将东西填入字符串/整数中,它们实际上应该是一流的数据类型)。 我怀疑我缺少重要/基本的东西。 我很高兴能向我展示我的方式的错误!

30
爸爸对我学习程序的步伐不耐烦。我该怎么办?[关闭]
因此,大约一个月前,我父亲给我买了5本关于编程的书(C ++,Java,PHP,Javascript,Android)。他是一名架构师,对编程一无所知。他买了我,因为我告诉他编程很有趣,我想学习。 您可能知道,小时候(我14岁)并被要求从枯燥的书籍中学习编程并不是最简单的事情。我总是分心。.我之前告诉过他,我不需要买书,我可以看在线教程..但是,他太老套了。他只是让我使用这些书。 最近,他开始问我如何处理它,我向他展示了我制作的C ++程序,该程序将接受您键入的内容,然后为每个字母分配值(A是字母中的第一个字母,因此它获取值之1)..依此类推。然后,它将所有值相加并告诉您。因此,“ add”一词的值为9。 ^^对他来说不是很令人印象深刻。他对我大吼,并告诉我我一直在做的事。这不是真的。他非常传统,固执,不听我说的话。我应该告诉他什么? PS:如果您有关于分区书籍的任何技巧,请告诉我 编辑:非常感谢大家,您不知道知道有些人了解我的情况对您有多重要。我读了每个人,我会考虑每个人的意见。格拉西亚斯!
200 java  learning  c++ 


16
Getter和Setters何时合理
getter和setter经常被批评为不合适的OO。另一方面,我见过的大多数OO代码都有大量的getter和setter方法。 何时使用吸气剂和塞特剂?您是否尝试避免使用它们?他们是否普遍滥用? 如果您最喜欢的语言具有属性(我的语言),那么此类问题也被视为此问题的获取者和准备者。从面向对象方法论的角度来看,它们是同一回事。他们只是语法更好。 Getter / Setter批评的来源(部分摘自评论以使他们更清晰可见): http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html http://typicalprogrammer.com/?p=23 http://c2.com/cgi/wiki?AccessorsAreEvil http://www.darronschall.com/weblog/2005/03/no-brain-getter-and-setters.cfm http://www.adam-bien.com/roller/abien/entry/encapsulation_violation_with_getters_and http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html 简单地说一下批评:Getters和Setters允许您从对象外部操纵对象的内部状态。这违反了封装。只有对象本身应该关心其内部状态。 以及示例程序版本的代码。 struct Fridge { int cheese; } void go_shopping(Fridge fridge) { fridge.cheese += 5; } Mutator版本的代码: class Fridge { int cheese; void set_cheese(int _cheese) { cheese = _cheese; } int get_cheese() { return cheese; } } void …

10
Mono通常被用来表示“是的,.NET是跨平台的”。该要求的有效性如何?[关闭]
在此时,您将为.NET和Java之间的项目选择什么?我说我会考虑“您将始终部署到Windows吗?” 在新的Web项目中占据先机的最重要的技术决定,如果答案为“否”,我建议使用Java而不是.NET。 一个非常普遍的反论点是“如果我们要在Linux / OS X /任何平台上运行,我们将只运行Mono” 1,这是表面上一个非常引人注目的论点,但我不同意原因。 OpenJDK和所有供应商提供的JVM已通过官方的Sun TCK,以确保一切正常。我不知道Mono通过Microsoft TCK。 Mono落后于.NET版本。当前完全支持什么.NET级别? 所有GUI元素(WinForms?)在Mono中都能正常工作吗? 企业可能不希望将开源框架作为官方计划B。 我知道随着Oracle对Java的新管理,未来并不安全,但是例如IBM为许多平台(包括Linux)提供了JDK。他们只是不是开源的。 那么,在哪种情况下Mono是.NET应用程序的有效业务策略? 1 Mark H总结为:“如果声称“我有一个用.NET编写的Windows应用程序,则应在mono上运行”,则不是,这不是有效的声明-但Mono已努力进行此类应用程序的移植更简单。”
168 java  .net  mono 

15
为什么像Java,Javascript和C#这样的内存管理语言保留了“ new”关键字?
newJava,Javascript和C#等语言中的关键字会创建类的新实例。 该语法似乎是从C ++继承的,在C ++中该语法new专门用于在堆上分配类的新实例,并返回指向该新实例的指针。在C ++中,这不是构造对象的唯一方法。您还可以在不使用new-的情况下在堆栈上构造一个对象,实际上,这种构造对象的方式在C ++中更为常见。 因此,来自C ++背景,newJava,Javascript和C#等语言中的关键字对我来说似乎很自然并且很明显。然后,我开始学习没有new关键字的Python 。在Python中,只需调用构造函数即可构造实例,例如: f = Foo() 最初,这对我来说似乎有点不对劲,直到我想到Python没有理由拥有它new,因为所有内容都是一个对象,因此无需区分各种构造函数语法。 但是后来我想new-Java 的真正意义是什么?我们为什么要说Object o = new Object();?为什么不只是Object o = Object();呢?在C ++中,绝对需要new,因为我们需要区分在堆上分配和在堆上分配之间的区别,但是在Java中,所有对象都在堆上构造,那么为什么还要使用new关键字呢?对于Javascript,可能会问同样的问题。在我不太熟悉的C#中,我认为new在区分对象类型和值类型方面可能有一些用途,但是我不确定。 无论如何,在我看来,C ++之后的许多语言只是“继承”了new关键字-并不需要它。它几乎像一个残余关键字。我们似乎出于任何原因都不需要它,但是它在那里。 问题:我对此是否正确?还是有一些令人信服的理由new需要以C ++启发的内存管理语言(例如Java,Javascript和C#)而不是Python?


6
Java 8为什么不包含不可变的集合?
Java团队做了很多出色的工作,消除了Java 8中函数编程的障碍。特别是,对java.util集合的更改在将转换链接到非常快速的流式操作方面做得很好。考虑到他们在集合上添加一流的函数和函数方法做得多么出色,为什么他们完全无法提供不可变的集合甚至不可变的集合接口呢? 在不更改任何现有代码的情况下,Java团队可以随时添加与可变接口相同的不可变接口,减去“ set”方法并使现有接口从其扩展,如下所示: ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | \ | \ | List Set Map ... 当然,诸如List.add()和Map.put()之类的操作当前会返回给定键的布尔值或先前值,以指示该操作是成功还是失败。不可变集合必须将此类方法视为工厂,并返回包含添加元素的新集合-该集合与当前签名不兼容。但这可以通过使用其他方法名称(例如ImmutableList.append()或.addAt()和ImmutableMap.putEntry())来解决。由此产生的冗长性将远远超过使用不可变集合的好处所抵消,并且类型系统将防止调用错误方法的错误。随着时间的流逝,旧的方法可能会被弃用。 永恒收藏的胜利: 简单性-当基础数据不变时,关于代码的推理就更简单了。 文档-如果某个方法采用不可变的集合接口,则您将知道它不会修改该集合。如果某个方法返回一个不可变的集合,则说明您无法对其进行修改。 并发-不可变集合可以在线程之间安全地共享。 …

11
是什么支持C ++可以比使用JIT的JVM或CLR更快的说法呢?[关闭]
我在许多问题中都注意到了SE上一个经常出现的主题,即一个持续的论点,即C ++比Java之类的高级语言更快和/或更有效。相反的论点是,由于JIT等原因,现代JVM或CLR可以同样高效,因为它可以处理越来越多的任务,而C ++ 仅在知道自己在做什么以及为什么以某种方式做事的情况下才更有效率。将会提高性能。这是显而易见的,并且很有意义。 我想知道一个基本的解释(如果有这样的事情...),以为什么和怎么样的任务一定是用C ++更快比JVM或CLR?仅仅是因为C ++被编译成机器代码,而JVM或CLR在运行时仍具有JIT编译的处理开销吗? 当我尝试研究该主题时,我发现的只是上面概述的相同论点,而没有任何确切的信息来了解如何准确地将C ++用于高性能计算。
119 java  c++  performance  jit 

10
为什么在Java 8+中使用Optional而不是传统的空指针检查?
我们最近已经迁移到Java8。现在,我看到应用程序充斥着Optional对象。 Java 8之前(样式1) Employee employee = employeeServive.getEmployee(); if(employee!=null){ System.out.println(employee.getId()); } Java 8之后(样式2) Optional<Employee> employeeOptional = Optional.ofNullable(employeeService.getEmployee()); if(employeeOptional.isPresent()){ Employee employee = employeeOptional.get(); System.out.println(employee.getId()); } 我看不到Optional<Employee> employeeOptional = employeeService.getEmployee();服务本身返回可选值时的附加值: 来自Java 6背景,我认为样式1更清晰,代码行更少。我在这里没有任何真正的优势吗? 通过对所有答案的理解和博客的进一步研究得到巩固
110 java  java8 

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.