我对C#非常熟悉,但开始在Java中工作更多.我希望得知Java中的枚举基本上与C#中的枚举相同,但显然情况并非如此.最初,我很高兴得知Java枚举可能包含多个数据,这似乎非常有利(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html).但是,从那时起我发现C#中缺少许多功能,例如能够轻松地为枚举元素分配特定值,以及因此无需花费大量精力就能将整数转换为枚举(即整数值转换为相匹配的Java枚举).
所以我的问题是:对于带有一堆公共静态最终字段的类,Java枚举是否有任何好处?或者它只提供更紧凑的语法?
编辑:让我更清楚.Java枚举对于具有相同类型的一组公共静态最终字段的类有什么好处?例如,在第一个链接的行星示例中,枚举对具有这些公共常量的类有什么好处:
public static final Planet MERCURY = new Planet(3.303e+23, 2.4397e6);
public static final Planet VENUS = new Planet(4.869e+24, 6.0518e6);
public static final Planet EARTH = new Planet(5.976e+24, 6.37814e6);
public static final Planet MARS = new Planet(6.421e+23, 3.3972e6);
public static final Planet JUPITER = new Planet(1.9e+27, 7.1492e7);
public static final Planet SATURN = new Planet(5.688e+26, 6.0268e7);
public static final Planet URANUS = new Planet(8.686e+25, 2.5559e7);
public static final Planet NEPTUNE = …Run Code Online (Sandbox Code Playgroud) 我正在用Java编写Web服务,我试图找出定义错误代码及其相关错误字符串的最佳方法.我需要将数字错误代码和错误字符串组合在一起.错误代码和错误字符串都将发送到访问Web服务的客户端.例如,当发生SQLException时,我可能想要执行以下操作:
// Example: errorCode = 1,
// errorString = "There was a problem accessing the database."
throw new SomeWebServiceException(errorCode, errorString);
Run Code Online (Sandbox Code Playgroud)
客户端程序可能会显示以下消息:
"发生错误#1:访问数据库时出现问题."
我的第一个想法是使用Enum错误代码并覆盖toString方法以返回错误字符串.这是我想出的:
public enum Errors {
DATABASE {
@Override
public String toString() {
return "A database error has occured.";
}
},
DUPLICATE_USER {
@Override
public String toString() {
return "This user already exists.";
}
},
// more errors follow
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:有更好的方法吗?我更喜欢代码中的解决方案,而不是从外部文件读取.我在这个项目中使用Javadoc,并且能够在线记录错误代码并在文档中自动更新它们会很有帮助.
我正在学习Java,并且发现接口可以有字段,这些字段是public static和final.到目前为止,我还没有看到这些例子.这些接口常量的一些用例有哪些,我可以在Java标准库中看到一些吗?
PHP接口允许在接口中定义常量,例如
interface FooBar
{
const FOO = 1;
const BAR = 2;
}
echo FooBar::FOO; // 1
Run Code Online (Sandbox Code Playgroud)
任何实现类都将自动提供这些常量,例如
class MyFooBar implement FooBar
{
}
echo MyFooBar::FOO; // 1
Run Code Online (Sandbox Code Playgroud)
我对此的看法是,任何Global都是邪恶的.但我想知道接口常量是否同样适用.鉴于对接口的编码通常被认为是良好的做法,使用接口常量是在类上下文之外使用的唯一常量吗?
虽然我很想听听您的个人意见以及您是否使用界面常量,但我主要是在您的答案中寻找客观原因.我不希望这是一个民意调查问题.我对使用接口常量对可维护性有什么影响感兴趣.耦合.或单元测试.它与SOLID PHP有什么关系?它是否违反了任何被认为是PHP良好实践的编码原则?你明白了......
注意: Java有一个类似的问题列出了一些很好的理由,说明它们是Bad Practice,但由于Java不是PHP,我认为再次在PHP标记中提出它是合理的.
假设您需要定义一个类,它所做的就是保持常量.
public static final String SOME_CONST = "SOME_VALUE";
Run Code Online (Sandbox Code Playgroud)
这样做的首选方式是什么?
我应该使用哪一个?为什么?
枚举 - 我不会使用枚举,我不会枚举任何东西,只是收集一些与任何方式无关的常量.
接口 - 我不打算将任何类设置为实现接口的类.只想使用接口调用常量,如下所示:ISomeInterface.SOME_CONST.
我在Java中有一个基本问题,但这是OOP中的一个普遍问题.为什么接口允许设置字段?这不是一个接口应该做的事情吗?
我理解它的方式,界面是英语中的形容词.因此,如果我的类实现了Runnable和Serializable接口,那么我确保用户我的类将满足条件为Runnable和Seriablizable.但是,这意味着接口是"无状态的",但允许它们在Java中有字段...
我错过了什么吗?
在Java中定义常量的位置的问题在论坛中出现了很多次,但我很难找到一个我觉得舒服的解决方案.
为简单起见,假设我有两个类:WriteMyData和ReadMyData.None是另一个的子类.两个类共享两个对其操作至关重要的常量:String DELIMITER和int LENGTH.将来我可能想要更改这些常量的值,以便在适当的地方定义它们.
这种共识似乎常常有利于这种enum类型.但是,在我的情况下没有什么可以枚举,所以我最终只有一个项目enum,我打电话DEFAULT:
public enum DataSettings {
DEFAULT(",", 32);
private final String delimiter;
private final int length;
DataSettings(String delmiter, int length) {
this.delimiter = delimiter;
this.length = length;
}
public String getDelimiter() { return delimiter; }
public int getLength() { return length; }
}
Run Code Online (Sandbox Code Playgroud)
因此,在我的两个类中,我通过DataSettings.DEFAULT.getDelimiter()和访问常量DataSettings.DEFAULT.getLength().
这是非常好的OO风格吗?是否使用enum过度杀伤?如果我不使用enum,我该怎么做?为常量创建一个接口似乎不受欢迎,而且我的类似乎没有自然的超类来源.初学者错误是只有一个默认项目enum吗?
可能重复:
与java中的静态字段接口以共享'常量'
我们需要在很多类中使用常量,我的问题是它是否是使用public属性或其他东西创建接口的最佳实践...
public static final String NAME = "Name";
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个场景,我正在使用一个Query对象和一个StringBuffer,我将构建一个SQL查询来执行.
这里是:
countQueryBuf.append("Select count(e) From " + clz.getSimpleName()
+ " e");
Run Code Online (Sandbox Code Playgroud)
在这里,我的大四学生告诉我,使用字符串文字是不好的做法"Select count(e) from ".我们可以做到:
string public final static selectCount="Select count(e) From "`
Run Code Online (Sandbox Code Playgroud)
在一个接口中,然后在字符串缓冲区中使用它.但是在看到这个与java中的静态字段的接口共享"常量"问题之后,这说明这是不好的做法,我很困惑.谁能告诉我什么是最好的方法来证明我的情景?