Questions tagged «java»

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

8
如果C允许,为什么Java完全不允许数字条件,如if(5){…}?
我有两个小程序: C #include <stdio.h> int main() { if (5) { printf("true\n"); } else { printf("false\n"); } return 0; } 爪哇 class type_system { public static void main(String args[]) { if (5) { System.out.println("true"); } else { System.out.println("false"); } } } 报告错误消息: type_system.java:4: error: incompatible types: int cannot be converted to …
33 java  c  type-systems 

8
在这里抛出异常是一种反模式吗?
代码审查后,我刚刚讨论了设计选择。我想知道您的意见是什么。 有一个此类Preferences,它是键-值对的存储桶。空值是合法的(这很重要)。我们希望某些值可能尚未保存,并且我们希望通过在请求时使用预定义的默认值对其进行初始化来自动处理这些情况。 讨论的解决方案使用以下模式(注意:显然,这不是实际的代码-出于说明目的而进行了简化): public class Preferences { // null values are legal private Map<String, String> valuesFromDatabase; private static Map<String, String> defaultValues; class KeyNotFoundException extends Exception { } public String getByKey(String key) { try { return getValueByKey(key); } catch (KeyNotFoundException e) { String defaultValue = defaultValues.get(key); valuesFromDatabase.put(key, defaultvalue); return defaultValue; } …


10
即使对象污染了其子类的API,也可以使用强制转换的对象吗?
我有一个基础课,Base。它有两个子类,Sub1和Sub2。每个子类都有一些其他方法。例如,Sub1has Sandwich makeASandwich(Ingredients... ingredients)和Sub2has boolean contactAliens(Frequency onFrequency)。 由于这些方法采用不同的参数并且做的事情完全不同,因此它们是完全不兼容的,我不能仅使用多态来解决此问题。 Base提供了大多数功能,并且我有大量的Base对象集合。但是,所有Base对象都是a Sub1或a Sub2,有时我需要知道它们是什么。 执行以下操作似乎是个坏主意: for (Base base : bases) { if (base instanceof Sub1) { ((Sub1) base).makeASandwich(getRandomIngredients()); // ... etc. } else { // must be Sub2 ((Sub2) base).contactAliens(getFrequency()); // ... etc. } } 因此,我想出了一个避免这种情况的策略。 Base现在有以下方法: boolean isSub1(); Sub1 asSub1(); Sub2 asSub2(); …

6
为什么嵌套循环被认为是不好的做法?
我的讲师今天提到,可以在Java中“标记”循环,以便在处理嵌套循环时可以引用它们。因此,我在不了解该功能的情况下查找了该功能,并在很多地方对该功能进行了解释,然后警告并阻止嵌套循环。 我真的不明白为什么吗?是否因为它影响代码的可读性?还是更具“技术性”?

3
Java是否免费/开源?
根据GNU通用公共许可(GPL)的条款,Sun在2006年11月13日发布了大部分Java作为自由和开源软件(FOSS)。2007年5月8日,Sun完成了该过程,除了一小部分未获得版权的代码外,所有Java核心代码都可以在自由软件/开源发行条款下获得。 OpenJDK(开放Java开发工具包)是Java编程语言的免费开源实现。这是Sun Microsystems在2006年开始的努力的结果。该实现已获得GNU通用公共许可证(GNU GPL)的许可,但有链接例外。 为什么仍然有人说Java不是像言论自由那样的开源或自由的? 我想念什么吗? Java仍然是专有的吗?

3
为什么不绿线?
虽然我知道有关此问题的问题已经解决(例如https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads),但我感觉自己并没有一个令人满意的答案。 问题是:为什么JVM不再支持绿色线程? 它在代码样式的Java FAQ上说了这一点: 绿色线程是指Java虚拟机(JVM)的一种操作模式,其中所有代码都在单个操作系统线程中执行。 然后在java.sun.com上: 不利之处在于,使用绿色线程意味着Linux上的系统线程无法得到利用,因此当添加其他CPU时Java虚拟机无法扩展。 在我看来,JVM可以具有等于内核数量的系统进程池,然后在此之上运行绿色线程。当您有大量经常阻塞的线程时(这可能是由于当前JVM限制了线程数),这可能会带来一些很大的优势。 有什么想法吗?

7
关于C#和Java是一半语言的陈述意味着什么?[关闭]
在文章:为什么选择POCO中,有这句话: Maciej Sobczak很好地指出:“我只是不喜欢有人给我一半的语言,并告诉我这是为了我自己的保护”。 我不明白他的意思,尽管C#是微软拥有与Java的由Oracle拥有的,但这并不意味着他们持有一半的语言,不是吗?我没有发现任何证据可以证明这一句话,对此我感到很好奇。甚至对“为了我自己的保护”部分感到好奇。
32 java  c#  microsoft  oracle 

8
Java中哪种样式更好(实例变量与返回值)
当我需要在类中的某些方法中使用公共数据时,我常常会努力决定要使用这两种方法中的哪一种。有什么更好的选择? 在此选项中,我可以创建一个实例变量,以避免必须声明其他变量,并且避免定义方法参数,但是可能不清楚在哪里实例化/修改这些变量: public class MyClass { private int var1; MyClass(){ doSomething(); doSomethingElse(); doMoreStuff(); } private void doSomething(){ var1 = 2; } private void doSomethingElse(){ int var2 = var1 + 1; } private void doMoreStuff(){ int var3 = var1 - 1; } } 还是只是实例化局部变量并将其作为参数传递? public class MyClass { MyClass(){ int var1 …

4
用Java处理调试输出的正确方法是什么?
随着我目前的Java项目变得越来越大,我感到同样需要在代码的多点插入调试输出。 为了适当地启用或禁用此功能,具体取决于测试会话的打开或关闭,我通常private static final boolean DEBUG = false在测试要检查的类的开头放置a ,然后以这种方式简单地使用它(例如): public MyClass { private static final boolean DEBUG = false; ... some code ... public void myMethod(String s) { if (DEBUG) { System.out.println(s); } } } 等等。 但这并不能使我感到高兴,因为它当然有效,但是如果您不仅仅盯着其中的几个,可能会有太多的类将DEBUG设置为true。 相反,我(就像-我认为-许多其他人一样)不希望将整个应用程序置于调试模式,因为输出的文本数量可能很庞大。 那么,有没有一种正确的方法来处理这种情况,或者最正确的方法是使用DEBUG类成员?


6
Spring应当自动装配哪些类(何时使用依赖注入)?
我已经在Spring中使用Dependency Injection已有一段时间了,我了解它的工作原理以及使用它的优缺点。但是,当我创建一个新类时,我常常想知道-该类是否应该由Spring IOC Container管理? 而且我不想谈论@Autowired注释,XML配置,setter注入,构造函数注入等之间的区别。我的问题是一个普遍的问题。 假设我们有一个带有Converter的服务: @Service public class Service { @Autowired private Repository repository; @Autowired private Converter converter; public List<CarDto> getAllCars() { List<Car> cars = repository.findAll(); return converter.mapToDto(cars); } } @Component public class Converter { public CarDto mapToDto(List<Car> cars) { return new ArrayList<CarDto>(); // do the mapping here } …

5
为什么C#和Java使用引用相等作为'=='的默认值?
我已经思考了一段时间,为什么Java和C#(我敢肯定其他语言)默认引用相等==。 在我做的编程中(当然,这只是编程问题的一小部分),在比较对象而不是引用相等时,我几乎总是想要逻辑相等。我试图思考为什么这两种语言都走这条路线而不是颠倒它,并具有==逻辑上的相等性,并.ReferenceEquals()用于引用相等性。 显然,使用引用相等很容易实现,并且行为非常一致,但是似乎并不适合我今天看到的大多数编程实践。 我不想对尝试实现逻辑比较的问题一无所知,并且必须在每个类中都实现它。我也意识到这些语言是很久以前设计的,但总的问题仍然存在。 默认情况下,我只是缺少一些主要好处,还是默认行为应该是逻辑相等,并且默认返回引用相等,而该类不存在逻辑相等似乎合理吗?


9
为什么在实现Builder模式时我们需要一个Builder类?
我已经看到了Builder模式的许多实现(主要是Java)。它们都有一个实体类(假设是一个Person类)和一个构建器类PersonBuilder。构建器“堆叠”各种字段,并返回new Person带有传递的参数的。为什么我们显式需要一个构建器类,而不是将所有构建器方法放在Person类本身中? 例如: class Person { private String name; private Integer age; public Person() { } Person withName(String name) { this.name = name; return this; } Person withAge(int age) { this.age = age; return this; } } 我可以简单地说 Person john = new Person().withName("John"); 为什么需要PersonBuilder上课? 我看到的唯一好处是,我们可以将Person字段声明为final,从而确保了不变性。

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.