从Java 8开始,您可以在Interfaces中实现默认或静态方法,如下所示
public interface DbValuesEnumIface<ID, T extends Enum<T>> {
T fromId(ID id);
ID getId();
static String getDescriptionKey(){
return "this is a test";
}
}
Run Code Online (Sandbox Code Playgroud)
我想声明上面的静态方法,其签名使用实现类定义的边界,因为方法的实现应该对所有人都相同,唯一不同的应该是声明的泛型,如下:
public interface DbValuesEnumIface<ID, T extends Enum<T>> {
public static T fromId(ID id) {
if (id == null) {
return null;
}
for (T en : T.values()) {
if (en.getId().equals(id)) {
return en;
}
}
}
ID getId();
String getDescriptionKey();
}
...
public enum Statuses implements DbValuesEnumIface<Integer,Statuses>
Run Code Online (Sandbox Code Playgroud)
因为T和ID不是静态的而且不能从静态上下文引用而中断.
那么,如何修改以上内容以便成功编译,如果不可能,应如何实现上述目标以实现所需目的,同时避免实现类中的代码重复.
所以我很难过,因为我非常精通Java,所以我无法想象这个看似微不足道的东西,但无论如何,我的Python教授为我们分配了一个实验室,我们必须创建一个基于行的字母模式和列位置.没有循环或迭代,只是条件语句.
例如,这个功能:
def letter(row, col):
if row>col:
return 'T'
else:
return 'W'
Run Code Online (Sandbox Code Playgroud)
会屈服:
WWWWWWWWWWWWWWWWWWWW
TWWWWWWWWWWWWWWWWWWW
TTWWWWWWWWWWWWWWWWWW
TTTWWWWWWWWWWWWWWWWW
TTTTWWWWWWWWWWWWWWWW
TTTTTWWWWWWWWWWWWWWW
TTTTTTWWWWWWWWWWWWWW
TTTTTTTWWWWWWWWWWWWW
TTTTTTTTWWWWWWWWWWWW
TTTTTTTTTWWWWWWWWWWW
TTTTTTTTTTWWWWWWWWWW
TTTTTTTTTTTWWWWWWWWW
TTTTTTTTTTTTWWWWWWWW
TTTTTTTTTTTTTWWWWWWW
TTTTTTTTTTTTTTWWWWWW
TTTTTTTTTTTTTTTWWWWW
TTTTTTTTTTTTTTTTWWWW
TTTTTTTTTTTTTTTTTWWW
TTTTTTTTTTTTTTTTTTWW
TTTTTTTTTTTTTTTTTTTW
Run Code Online (Sandbox Code Playgroud)
如果通过他的驱动文件运行,行和col都等于20.
我坚持的那个是为模式创建一个函数:
XOOOOOX
OXOOOXO
OOXOXOO
OOOXOOO
OOXOXOO
OXOOOXO
XOOOOOX
Run Code Online (Sandbox Code Playgroud)
请不要给我答案,而是指向正确的方向.
到目前为止,我知道当row == col时,可以识别左 - 右对角线的X'.这是正确的 - >左对角线我遇到了问题.
非常感谢.
我有以下实体的问题:森林,树,叶.你可以想象森林可以有很多树木,树上有很多树叶.
我想懒得加载森林的所有树木,并渴望加载一棵树的所有树叶.我的hibernate注释代码如下所示:
Forest.java
@Entity
@Table(name = "Forests")
public class Forest implements Comparable<Forest> {
@Id
@Column(name = "forestnumber", length=10, nullable=false)
private String number;
@OneToMany(fetch=FetchType.LAZY, mappedBy="forest")
private Set<Tree> trees = null;
// some other attributes and methods
Run Code Online (Sandbox Code Playgroud)
Tree.java
@Entity
@Table(name = "Trees")
public class Tree implements Comparable<Tree> {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="tree_id", nullable=false)
private int id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "forestnumber", nullable = false)
@Fetch(FetchMode.JOIN)
private Forest forest;
@OneToMany(fetch=FetchType.EAGER, mappedBy="tree")
@Fetch(FetchMode.JOIN)
private Set<Leaf> leafs = null;
// some other attributes and methods …Run Code Online (Sandbox Code Playgroud) 我最近研究了依赖注入设计模式。
class User
{
private $db;
public function __construct(Database $db)
{
$this->$db = $db;
}
}
Run Code Online (Sandbox Code Playgroud)
我不禁怀疑这与我在聚合中学到的东西是一样的。如果我错了,请纠正我。我知道目标的依赖注入和聚集是不同的。有什么我想念的吗?
FlatFileItemReader与一起使用了很多示例TaskExecutor。我在下面提供了示例(都带有XML和Java Config):
我已将自己的XML配置用于大型CSV(GB大小)的开箱即用JpaItemWriter。即使不设置save-state = false或进行任何特殊处理,似乎也没有问题。
现在,FlatFileItemReader已记录为不是线程安全的。
我的猜测是,JpaItemWriter通过持久保存集(即如果hashCode()和equals()覆盖实体的业务密钥,则没有重复)的集合来“发现”问题。但是,即使这样,由于非线程安全的读取和处理,也无法防止重复。
您能否澄清一下:FlatFileItemReader在分配了TaskExecutor的Tasklet 中使用开箱即用的方法是否正确/正确/安全?不论作家。如果没有,我们如何在理论上解释JPAItemWriter使用a时没有错误?
PS:我上面给出的示例链接FlatFileItemReader与TaskExecutor一起使用,而没有提及所有可能的线程安全问题...
考虑以下:
public abstract class Item {
String name;
String description;
//concrete getters and setters follow
}
public class InventoryItem extends Item {
//empty subclass of Item
}
public class CartItem extends Item {
int quantity;
int tax;
//getters and setters for quantity and tax follow
}
Run Code Online (Sandbox Code Playgroud)
InventoryItem表示可供销售的项目,而CartItem表示添加到购物车的项目,因此它具有其他属性,如数量和税金.在这种情况下,是否可以使用抽象类Item的空子类?
选项2:我们可以有一个空的Item接口.InventoryItem将实现Item并定义名称和描述属性,并具有getter和setter.CartItem将从InventoryItem扩展,并将数量和税收定义为属性,并具有getter和setter.
选项3:拥有Item接口会更好吗?InventoryItem将实现Item.然后我们可以有一个CartItem类,它有'一个'项和两个属性,即税和数量
我正在尝试编写一种从二进制搜索树中删除节点的方法.这是我删除节点的方法.
public void delete(int deletionNodeValue) {
Node<Integer> nodeToBeDeleted = getNode(deletionNodeValue);
if(nodeToBeDeleted == null) return; // No node with such value exists throw an error
if(isLeafNode(nodeToBeDeleted)) {
nodeToBeDeleted = null;
} else if (nodeToBeDeleted.getNumChildren() == 1) {
bypassNode(nodeToBeDeleted);
}else {
replace(nodeToBeDeleted, getSuccessor(nodeToBeDeleted.getValue()));
}
}
Run Code Online (Sandbox Code Playgroud)
我在叶子节点上检查了这个方法,但是在调试之后我发现执行的nodeToBeSelected=null发生,实际上没有删除节点.因为我仍然可以搜索已删除的值,程序仍然设法获取它.
tree.add(5);
tree.delete(5);
System.out.println(tree.getNode(5).getValue()); // Output : 5, should've been deleted
Run Code Online (Sandbox Code Playgroud)
这是我的getNode()方法
public Node<Integer> getNode(int searchValue) {
Node<Integer> currentNode = root;
while(currentNode != null) {
int currentNodeValue = currentNode.getValue();
if(searchValue == currentNodeValue)
return currentNode;
else …Run Code Online (Sandbox Code Playgroud) public class Test
{
public static void printValue(int i, int j, int k)
{
System.out.println("int");
}
public static void printValue(byte...b)
{
System.out.println("long");
}
public static void main(String... args)
{
byte b = 9;
printValue(b,b,b);
}
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是"int".但它应该是"长"因为字节类型参数函数已经存在.但是这里的程序正在将字节值提升为int,但情况并非如此.
有人可以澄清这里发生了什么吗?
我开始学习一些Java,我已经阅读了很多关于如何通过JVM分配内存以及因此如何使用垃圾收集器释放内存的方法.
我无法找到的一件事是,如果我创建两个完全相同的新对象,它们会引用内存中的相同位置?与String Pool的工作方式类似.
使用Java 7 我正在尝试构建一个监视数据存储(某些集合类型)的观察程序,然后在某些点返回某些项目.在这种情况下,它们是时间戳,当时间戳通过我希望它返回到起始线程的当前时间.请参阅下面的代码.
@Override
public void run() {
while (!data.isEmpty()) {
for (LocalTime dataTime : data) {
if (new LocalTime().isAfter(dataTime)) {
// return a result but continue running
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了关于未来和可赎回的内容,但他们似乎在回归时停止了这个问题.
我不特别想要返回一个值并停止线程,然后启动另一个任务,如果使用callable,除非这是最好的方法.
寻找这个的最佳技术是什么?似乎有这么广泛的做法.
谢谢