标签: class

Java:如何确定初始化程序块中定义的本地类是否需要封闭实例进行实例化?

现在我正在实现一个方法,它有一个Class类型的参数,如果给定的类对象需要一个实例来封闭它来实例化它,那么这个方法返回一个布尔值.

该方法目前的工作原理如下:

    if (clazz.getEnclosingClass() == null) {
        return false;
    }
    if (clazz.isAnonymousClass() || clazz.isMemberClass()) {
        return !Modifier.isStatic(clazz.getModifiers());
    }
    if (clazz.getEnclosingConstructor() != null) {
        return true;
    }
    final Method enclosingMethod = clazz.getEnclosingMethod();
    if (enclosingMethod != null) {
        return !Modifier.isStatic(enclosingMethod.getModifiers());
    }
Run Code Online (Sandbox Code Playgroud)

解释为什么这样设计:

  1. 它首先检查它是否是顶级类,如果是,算法可以安全地返回false
  2. 如果该类是匿名的或成员类,如果它不是静态的,则它需要一个关闭实例(如果在静态构造函数/ method/initializer-block中声明了anynmous类,则它是自动静态的)
  3. 现在可以假定该类是本地类(忽略数组和基元),因此它在构造函数,方法或初始化程序中定义.但是,与匿名类不同,本地类从不被视为静态类,但如果在非静态块中定义本地类,则仍需要封闭实例.
  4. 构造函数永远不会是静态的,因此在这种情况下返回true
  5. 如果它在方法中定义,则如果方法不是静态的,则返回true

我需要步骤6来确定本地类是驻留在静态初始化块还是实例初始化块中,所以我已完成此函数的实现.

所以这里的反射API有点短.没有方法Class.getEnclosingInitializer()等,也没有一个类代表反射包中的初始化器.

初始化程序块不是类的成员吗?在java 1.8规范中,Member接口只有实现类Field,Executable(带有子类Constructor和Method),然后有大多数反射用户的成员名称.

我不确定规范背后的人是否忘记了这种情况,如果在静态方法/初始化程序(如匿名类)中声明,本地类实际应该是静态的.但在我看来,从这个角度来看,它缺乏最后的一致性.

那么有没有人知道如何确定本地类声明在哪种类型的初始化程序块中?

我并不是真的热衷于挖掘一个类似于它的封闭类的合成类型的字段,或者循环它的构造函数以获得类似于它的东西(旁注:参数对象Constructor.getParameters()始终返回false isImplicit()isSynthetic()不管我尝试什么. ......那似乎是错的).所以如果我能避免这样的解决方案那么好.

java reflection static class

11
推荐指数
1
解决办法
272
查看次数

为什么方法中不允许使用静态本地类?

我一直在刷掉我的java并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况.

1.为什么本地类不允许使用静态方法?

2.为什么方法中不允许使用静态本地类?

  1. 本地类中不允许使用静态方法:

在这里,我不明白.对我来说,本地类与静态方法main相关联.我只是不明白为什么不能这样做.方法main通过Sequence类访问,然后因为sayGoodbye是静态的,所以应该通过它的类访问它.但不是.

public class Sequence {

    public static void main(String... args) {

        class EnglishGoodbye {
            public static void sayGoodbye() { // this cannot be done
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 方法中不允许使用静态本地类:

这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联.我糊涂了.

public class Sequence {

    public static void main(String... args) {

        static class EnglishGoodbye { //static local classes not allowed
            public static void sayGoodbye() {
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我得到的第一个答案是来自oracle的引用:

本地类是非静态的,因为它们可以访问封闭块的实例成员.因此,它们不能包含大多数类型的静态声明.

和我的回复:

但这并没有真正解释一切.如果您有内部类,则无法访问非静态字段,但可以访问静态字段.同样应该适用于本地类,因为没有静态变量,所以它是无用的.但是在我的例子中,方法呢.

好吧,我制作了一个模式来更好地解释我如何看待事物.虽然这可能完全是错误的,但我有点羞于表现出来.在这种模式中,并在场景中静态局部类可以访问我不得不在顶部内存块的局部类.每当调用静态方法2时,它只会引用它.

在此输入图像描述

java oop class

11
推荐指数
1
解决办法
2163
查看次数

为什么常量约束属性来自结构实例而不是类实例?

当我尝试更改实例的ID属性时byValueObj,我收到一个错误,告诉我无法分配常量的属性,即使属性是变量.但是,我可以在类实例上执行此操作.我知道它可能与by值和引用机制有关.但我对它没有非常明确和正确的理解.有人可以帮我解释一下吗?谢谢.

struct CreatorValue{
    var ID = 2201
}
class CreatorRefer{
    var ID = 2203
}

let byValueObj = CreatorValue()
let byReferObj = CreatorRefer()

byValueObj.ID = 201 //Error: cannot assign to property: 'byValueObj' is a 'let' constant
byReferObj.ID = 203 //works fine here
Run Code Online (Sandbox Code Playgroud)

structure class constants swift

11
推荐指数
1
解决办法
2004
查看次数

如何有条件地将一个函数添加到类模板?

我有一个Matrix类模板如下:

template<typename T, std::size_t nrows, std::size_t ncols>
class Matrix
{
    T data[nrows][ncols];
public:
    T& operator ()(std::size_t i, std::size_t j)
    {
        return data[i][j];
    }
};
Run Code Online (Sandbox Code Playgroud)

我要的是定义一个.setIdentity()当实例的唯一功能nrows==ncolstrue在编译的时候.而且会有任何的定义.setIdentity()时,nrows==ncolsfalse.

我正在尝试使用的是enable_if成语,但这将为所有情况定义函数.不是吗?

c++ templates class template-specialization c++11

11
推荐指数
4
解决办法
2588
查看次数

Swift 3:是否继承NSObject?

我看过一些帖子像这样一个关于子类之间的差别NSObject在斯威夫特或者只是有其天然的基础class,没有子类.但他们都有点旧帖,我不清楚这个话题.

NSObject什么时候应该继承?子类化和非子类化之间的实际区别是什么?目前Swift的推荐是什么?

inheritance class subclass nsobject swift

11
推荐指数
1
解决办法
1万
查看次数

如何用Jasmine窥探静态类方法

我有一个静态方法的类,我想在Jasmine中测试.我知道静态方法不能在类的实例上调用.所以除了找不到spyOn的方法之外,我的测试没有通过,但是如何用Jasmine在类中测试静态方法呢?

谢谢!

class Foo {
    static foobar (a, b) {
      return a * b
    }
}
Run Code Online (Sandbox Code Playgroud)

茉莉花测试

it ('should test a static method', () => {
    let foo = new Foo()
    spyOn(foo, 'foobar')
    foo.foobar(2,3)
    expect(foo.foobar).toBe(6)
})
Run Code Online (Sandbox Code Playgroud)

javascript static class spy jasmine

11
推荐指数
1
解决办法
1万
查看次数

如何使用C++模板参数来确定类中的成员类型

我想创建一个Vertex类,并希望通过能够创建一个32位浮点和64位双版本,以及可能是int版本来泛化它.我想这样做:

template <typename P>
struct Vertex
{
    if (typeid(P) == typeid(float))
    {
         vec3 position;
         vec3 normal;
         vec2 texcoords;
    }
    else if (typeid(P) == typeid(double))
    {
         dvec3 position; // This is a double vector
         dvec3 normal;
         dvec2 texcoords;
    }
    else if (typeid(P) == typeid(int))
    {
         ivec3 position; // This is an integer vector
         ivec3 normal;
         ivec2 texcoords;
    }

};
Run Code Online (Sandbox Code Playgroud)

我不认为语句是否在编译时没有被评估,所以这只是我想要做的一个例子.有没有办法做到这一点?或者我必须专门化每种类型,或只是重写所有不同的版本?

c++ templates class

11
推荐指数
2
解决办法
1128
查看次数

Java 9:如何找到添加的每个新方法

在Java 9的发布,许多方法已经被添加到许多类,大部分(如果不是全部),其中包含了文档中的以下内容:

从:9

是否有一种简单的方法可以在任意类中添加任何新方法而无需浏览其文档?

示例: ByteBuffer.alignedSlice

java methods javadoc class java-9

11
推荐指数
2
解决办法
331
查看次数

成员初始化列表错误的统一初始化

我在这个C++ 11代码上遇到编译错误,但我不知道为什么.这是代码:

#include <condition_variable>

class NonCopiableClass
{
    std::condition_variable condition_;
};

struct NonCopiableStruct
{
    std::condition_variable condition_;
};

class Test
{
 public:
    Test() : 
        myClass{},
        myStruct{}
    {};
 private:
    NonCopiableClass myClass;
    NonCopiableStruct myStruct;
};
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2015失败,出现以下错误:

错误C2280:'std :: condition_variable :: condition_variable(const std :: condition_variable&)':尝试引用已删除的函数1> c:\ program files(x86)\ microsoft visual studio 14.0\vc\include\mutex(550 ):注意:请参阅'std :: condition_variable :: condition_variable'的声明.

如果我更改Test constructor为不使用C++ 11统一初始化Struct它编译好了.

Test() : 
        myClass{},
        myStruct() // <--- CHANGE
    {};
Run Code Online (Sandbox Code Playgroud)

我没有得到为什么Struct类型使用复制构造函数,但Class似乎没问题.只有Struct拥有不可复制的成员才会发生这种情况.

我还注意到,如果我初始化成员初始化列表的Struct外部Test …

c++ struct class c++11 visual-c++-2015

11
推荐指数
1
解决办法
476
查看次数

为什么在函数与类中处理未绑定本地的差异?

在引用全局变量时,可以看到函数和类以不同方式处理它.第一个很好,第二个导致错误:

x = 10
class Foo():
    x = x + 1
a = foo()
Run Code Online (Sandbox Code Playgroud)

VS:

x = 10
def faa():
    x = x + 1
faa()
Run Code Online (Sandbox Code Playgroud)

Python执行模型中,这被描述为:

类定义是可以使用和定义名称的可执行语句.这些引用遵循名称解析的常规规则,但在全局命名空间中查找未绑定的局部变量.

但为什么?

唯一的其他提示我所遇到的是该位:

然后使用新创建的本地命名空间和原始全局命名空间,在新的执行框架中执行类的套件(请参阅命名和绑定一节).(通常,套件仅包含函数定义.)当类的套件完成执行时,其执行帧将被丢弃,但其本地名称空间将被保存.4然后使用基类的继承列表和属性字典的已保存本地名称空间创建类对象.

这仍然没有解释为什么这应该导致在全局命名空间中查找未绑定的本地人.

这两个链接都来自这个答案,虽然没有详细说明原因.

python attributes scope class function

11
推荐指数
1
解决办法
202
查看次数