这两个内部类声明有什么区别?还评论优点/缺点?
案例A:类中的类.
public class Levels {
static public class Items {
public String value;
public String path;
public String getValue() {
return value;}
}
}
Run Code Online (Sandbox Code Playgroud)
和案例B:接口内的类.
public interface Levels{
public class Items {
public String value;
public String path;
public String getValue() {
return value;}
}
}
Run Code Online (Sandbox Code Playgroud)
纠正:放置getvalue方法.
进一步的信息:我能够在另一个没有实现接口AT ALL的类中实例化A和B两种情况下的Items类.
public class Z{//NOTE: NO INTERFACE IMPLEMENTED here!!!!
Levels.Items items = new Levels.Items();
}
Run Code Online (Sandbox Code Playgroud)
由于接口未实例化,因此接口内的所有元素都可以通过点符号访问,而无需实例化LEVELS接口,因为您无法实例化接口 - 有效地在可渗透静态引用的接口内定义类.
所以说B案例中的Items类不是静态的没有意义.由于情况A和B都以相同的方式实例化,我不是在寻找静态或内部或嵌套的语义.停止给我关于语义的答案.我想要编译器,运行时和行为差异/优点,或者如果没有,那么就这么说.没有更多的语义答案请!!!!! JVM或.NET VM规范的专家请求这个答案问题,而不是教科书语义学.
静态类被认为是不好的做法?几天前我读了一篇关于这个的文章(找不到,对不起),基本上说有静态类(特别是那些'帮助'类)通常是坏代码的标志.这是正确的,如果是的话,原因是什么?
这是一个带有Hibernate的Spring MVC项目.我正在尝试创建一个Logger类,负责将日志输入数据库.其他类只调用具有一些属性的正确方法,这个类应该做所有的魔术.本质上它应该是一个具有静态方法的类,但这会导致autoiering dao对象出现问题.
public class StatisticLogger {
@Autowired
static Dao dao;
public static void AddLoginEvent(LogStatisticBean user){
//TODO code it god damn it
}
public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
//TODO code it god damn it
}
public static void addErrorLog(Exception e, String page, HashMap<String, Object> parameters){
ExceptionLogBean elb=new ExceptionLogBean();
elb.setStuntDescription(e);
elb.setSourcePage(page);
elb.setParameters(parameters);
if(dao!=null){ //BUT DAO IS NULL
dao.saveOrUpdateEntity(elb);
}
}
Run Code Online (Sandbox Code Playgroud)
怎么做对了?我该怎么做才能使dao对象为null?我知道我可以将它作为方法参数传递,但这不是很好.我猜测autowired无法在静态对象上工作,因为它们是为早期创建的,所以尚未创建自动维护机制.
在C#中,静态类是一个类,除了不支持继承之外,还可以具有"普通"类除了实例成员之外的任何类型的成员.
不太确定静态类在java中是如何工作的,但基于我看到的有限数量的java代码,我很清楚它们的工作方式并不完全相同.
有人可以列举一下差异吗?
我有一个有趣的问题.我需要动态包装静态类.即返回一个非静态实例给我的调用者.例如:
public object CreateInstance(string className) {
Type t = assembly.GetType(className);
if (IsStatic(t)) {
return CreateStaticWrapper(t);
} else {
return Activator.CreateInstance(t);
}
}
Run Code Online (Sandbox Code Playgroud)
所以我需要的是如何实现的指针CreateStaticWrapper.
注意:遗憾的是我无法使用Dynamic对象.
那么我的选择是什么?我不是那么热衷于学习IL一代吗?如果IL生成(Reflection.Emit,或者现在还有其他方法吗?)是什么方法,那么有没有人有指针?
编辑:重要的是要注意我可以返回代表词典.所以我可以使用Delegate.CreateDelegate这个,但我似乎无法解决如何处理重载方法和通用方法.
Edit2:另一种选择是使用Emit将空构造函数注入到类型中,再次指向任何指针?甚至可以在标记为静态的类型上进行此操作吗?static关键字是否会进入IL?
Edit3:对于一些上下文,我将它传递给javascript环境,请参阅: 我的项目.所以我希望能够(在JavaScript中):
var fileHelper = .create('System.IO.File');
if (fileHelper.Exists(fileName)) { fileHelper.Delete(fileName); }
Run Code Online (Sandbox Code Playgroud)
谢谢大家.
我想知道封闭类可以创建多少个静态成员类的实例.我只假设一个,但是Bloch的以下摘录对我来说没有意义.
引用Joshua Bloch的有效Java - 项目22*:支持非静态的静态成员类.
私有静态成员类的常见用法是表示由其封闭类表示的对象的组件.例如,考虑一个Map键,它将键与值相关联.许多Map实现都为地图中的每个键值对都有一个内部Entry对象.虽然每个条目都与一个映射关联,但条目上的方法(getKey,getValue和setValue)不需要访问映射.因此,使用非静态成员类来表示条目是浪费的:私有静态成员类是最好的.如果您不小心在条目声明中省略了静态修饰符,则地图仍然有效,但每个条目都将包含对地图的多余引用,这会浪费空间和时间.
他声明地图为地图中的每个键值对创建了一个Entry对象,即静态成员类的多个实例.
所以我的假设是错误的!这意味着我对静态成员类的理解是错误的.每个人都知道静态成员变量的行为方式,例如经典的静态最终字符串 - 只有一个对象的实例.
这是否意味着当实例化封闭对象时,实际上没有实例化静态成员类?
那么在这种情况下,使用静态成员类进行Entry的Map有什么意义呢?为什么不在API上使用接口?然后,每个其他Collections类都可以提供它自己的实现.
[*]刚才意识到它是我所拥有的PDF版本的第18项
使用内部静态类有什么好处?我应该在哪里选择其他选项呢?
它的内存如何分配?
我想要衡量人们对使用静态类而不是命名空间的看法.我来自C++背景,我非常喜欢它的语法以及它如何让你构建代码.我最近决定将代码分组为逻辑单元而不仅仅是文件.例如,我更喜欢User :: login to user_login之类的调用.所以,我做了一些谷歌搜索,并松了一口气,发现PHP有名称空间.我的解脱并没有持续多久,我真的不喜欢语法; 它为我的函数调用增加了更多的混乱.所以,目前我正在使用静态类来模拟命名空间.这有什么缺点吗?
我在PHP Namespaces vs Classes中发现了一个类似的问题,但是没有进行大量的讨论.
还有,有办法避免以下情况:
class Test {
public static void myFunc() {
Test::myOtherFunc();
}
public static void myOtherFunc() {
}
}
Run Code Online (Sandbox Code Playgroud)
我假设可以在不指定名称的情况下调用同一类中的函数,但显然不是.是否有任何变通方法(例如在C++中有using关键字).
今天,我一直在阅读静态类和私有构造函数.
静态类 - 我们无法在静态类上创建实例.我们不能继承静态类.仅生成单个实例.
私有构造函数 - 我们无法创建实例.我们不能继承.(我不知道生成了多少个实例.)
我创建了两个控制台应用程序,一个用于静态类,一个用于私有构造函数.
静态类代码
我理解生成的单个对象作为构造函数被调用一次.
私有构造函数代码
现在,我不明白是否生成了任何对象.
我有两个问题.
问题1.我没有发现Private构造函数和Static类之间有任何特别的区别.你能告诉我在哪种情况下我应该使用Private Constructor,我应该在哪里使用Static类,因为我可以使用它们.
问题2.如果我使用私有构造函数,会生成多少个对象?
谢谢.
编辑:
我认为人们不理解我的问题.我知道静态构造函数总是在第一个引用上调用一次.静态构造函数用于初始化类的静态成员.
问题1.我有一种情况:我需要创建一个无法实例化的类.我可以通过静态类或私有构造函数来完成.所以我的问题是"两者之间有什么区别吗?我应该使用哪一个?"
问题2.如果我使用私有构造函数,创建了多少个对象?如果answer为0,则私有构造函数的内存分配在CLR中如何工作.如果我使用私有构造函数,则没有内存分配.
static-class ×10
java ×5
c# ×3
nested-class ×2
.net ×1
autowired ×1
clr ×1
code-design ×1
hibernate ×1
instance ×1
namespaces ×1
non-static ×1
object ×1
oop ×1
php ×1
spring ×1
spring-mvc ×1