Tag: 语言设计

Java:枚举常量中方法和变量的定义

我正在做一些实验并且意外地编写了一个代码,这非常奇怪而且我不能完全理解。 我甚至感到惊讶,我可以编译它。 它看起来像这样: enum Foo { VALUE_1 { public int myVariable = 1; }, VALUE_2 { public void myMethod() { // } }, VALUE_3; } 正如预期的那样,不可能通过以下方式访问这样的元素: Foo.VALUE_2.myMethod(); 原因是,编译器将在枚举本身内查找该方法。 我假设不可能从枚举之外访问这些方法和变量。 出于这个原因,我尝试创建一个参数化构造函数并使用一些内部变量调用它: enum Foo { VALUE(internalVariable) { int internalVariable = 1; }; private Foo(int param) { // } } 编译这样的结构是不可能的。 现在我在想如果没有办法访问它,那么在常量中定义一些内容是什么意思。 我试图在常量中创建同名的方法以及枚举本身,以检查它是否以某种方式发生碰撞。 它没有! enum Foo { VALUE_1 […]

为什么HttpRequest.HttpMethod是字符串而不是枚举?

在.NET Framework 的HttpRequest.HttpMethod参考中 ,请求类型使用System.String类型声明。 在RFC 2616中声明了所有HTTP请求方法(例如POST,GET,PUT,DELETE ……)。 在HttpWebRequest和.NET的WebRequest类中也有类似的行为。 Java在HttpURLConnection#setRequestMethod(String)方法上有类似的方法。 为什么这些语言设计者不考虑为这些HTTP方法实现枚举? 你有好主意吗?

你如何强制构造函数签名和静态方法?

是否有一种方法可以强制(子)类在C#或Java中使用具有特定签名或特定静态方法的构造函数? 你显然不能使用接口,我知道它的用途有限。 我发现它有用的一个实例是当你想强制执行一些设计指南时,例如: 例外 它们应该都有四个规范构造函数,但是没有办法强制执行它。 你必须依靠像FxCop(C#case)之类的工具来捕获它们。 运营商 没有合同规定可以对两个类求和(在C#中使用operator +) 是否有任何设计模式可以解决此限制? 可以在语言中添加什么构造来克服C#或Java的未来版本中的这种限制?

数组的最大大小 – 类型不匹配:无法从long转换为int

我看到数组的最大大小只能是Int的最大大小。 为什么Java不允许长度为Max的数组? long no = 10000000000L; int [] nums = new int[no];//error here

像C#/ Java这样的高级语言掩盖位移计数操作数的原因是什么?

这更多的是语言设计而不是编程问题。 以下是JLS 15.19移位运算符的摘录: 如果左侧操作数的提升类型是int ,则只使用右侧操作数的五个最低位作为移位距离。 如果左侧操作数的提升类型很long ,则只使用右侧操作数的六个最低位作为移位距离。 这种行为也在C#中指定 ,虽然我不确定它是否在Javascript的官方规范中(如果有的话),但至少基于我自己的测试也是如此。 结果是以下情况属实: (1 << 32) == 1 据我所知,这个规范很可能受到以下事实的启发:当移位32位值时(6位为64位),底层硬件仅占用计数操作数的5位,我可以理解在例如,JVM级别,但为什么高级语言(如C#和Java)会保留这种相当低级别的行为? 它们不应该提供超出硬件实现的更抽象的视图,并且行为更直观吗? (如果他们可以采取负数来表示向其他方向转移,那就更好了!)

为什么Java没有块范围的变量声明?

以下方法不起作用,因为内部块声明与外部块中的名称相同的变量。 显然,变量属于声明它们的方法或类,而不属于声明它们的块,因此我无法编写一个简短的临时块来进行调试,这会将外部作用域中的变量推送到阴影片刻: void methodName() { int i = 7; for (int j = 0; j < 10; j++) { int i = j * 2; } } 几乎我用过的每一种块范围的语言都支持这种语言,包括我在学校编写解释器和编译器的琐碎小语言。 Perl可以做到这一点,就像Scheme一样,甚至是C.甚至PL / SQL都支持这个! 这个Java设计决策的基本原理是什么? 编辑:有人指出,Java确实有块范围。 我问的概念是什么名字? 我希望我能从那些语言设计课程中记住更多。 🙂

Java的枚举优于旧的“Typesafe Enum”模式?

在JDK1.5之前的Java中,“Typesafe Enum”模式是实现只能获取有限数量值的类型的常用方法: public class Suit { private final String name; public static final Suit CLUBS =new Suit(“clubs”); public static final Suit DIAMONDS =new Suit(“diamonds”); public static final Suit HEARTS =new Suit(“hearts”); public static final Suit SPADES =new Suit(“spades”); private Suit(String name){ this.name =name; } public String toString(){ return name; } } (参见例如Bloch的Effective Java的第21项)。 现在在JDK1.5 +中,“官方”方式显然是使用enum […]

generics类中的Javagenerics方法

如果在Java中创建generics类(该类具有generics类型参数),您可以使用generics方法(该方法采用generics类型参数)吗? 请考虑以下示例: public class MyClass { public K doSomething(K k){ return k; } } public class MyGenericClass { public K doSomething(K k){ return k; } public List makeSingletonList(K k){ return Collections.singletonList(k); } } 正如您对通用方法所期望的那样,我可以使用任何对象在MyClass实例上调用doSomething(K) : MyClass clazz = new MyClass(); String string = clazz.doSomething(“String”); Integer integer = clazz.doSomething(1); 但是,如果我尝试使用MyGenericClass实例而不指定generics类型,我调用doSomething(K)将返回一个Object ,无论传入的是什么K : MyGenericClass untyped = new […]